0

私はテーブル名「製品」を持っています

ProductID   ProductName
1           A
2           B
3           C
4           D

「ViewedProduct」という名前の別のテーブル

ProductID    Views    UserID
2            2        55
2            1        40
1            10       40
1            50       127.0.1
3            51       127.0.1

UserID 55 の場合、期待される結果は次のようになります。

ProductID    ProductName
2            B
1            A
3            C
4            D

UserID 55 のビューが一番上にあり、他のすべての viewdproduct はビューの合計の順に並べる必要があります。2 人の異なる UserID によって閲覧された製品 ID 1 の合計閲覧数は 60 であるため、2 番目に位置する必要があります。製品 ID 3 には 51 回のビューがあり、3 位になるはずです。

2 番目の例:

 ProductID    Views    UserID
    2            2        55
    3            3        55
    2            1        40
    1            10       40
    1            50       127.0.1
    3            51       127.0.1
    4            50       127.0.1

UserID 55 の場合、最初に UserID 55 に基づいて結果をソートする必要があります。次に、残りの結果が表示されます。今、私が必要とする期待される結果は

ProductID    ProductName
3            C
2            B
1            A
4            D

製品 ID 3 と 2 は、UserID 55 がこれをそれぞれ 3 回と 2 回閲覧したため、トップではありません。しかし、表示されたテーブルからの合計ビューは 60 です。また、userid 55 はこの製品を表示していませんが、ビュー テーブルからの合計ビューは 50 であるため、productID 4 が最後になります。

-- さらに説明が必要な場合はコメントしてください

4

2 に答える 2

1

ここで何を求めているのかは明確ではありませんが、これらのテーブルのいずれかから結果を返し、別のテーブルの列で並べ替えたい場合は、メイン テーブルと並べ替えたい列を保持するテーブルの間に結合を作成するだけです。これにより、結合されたテーブルの列で並べ替えることができます。

SELECT Product.ProductID, Product.ProductName
FROM Product
LEFT JOIN ViewedProduct ON Product.ProductID = ViewedProduct.ProductID
ORDER BY ViewedProduct.UserID

ただし、UserID 55 は ProductID 1 または 3 を表示していないため、期待どおりの結果は返されず、順序付けは単純に昇順または降順になります。

UserID 55 で商品を表示する場合は、where 句が必要です。

SELECT Product.ProductID, Product.ProductName
FROM Product
LEFT JOIN ViewedProduct ON Product.ProductID = ViewedProduct.ProductID
WHERE ViewedProduct.UserID = 55

サンプルよりも多くのデータがない限り、これは 1 行だけを返します。

ビューの数で並べ替えたい場合は、次のようにしてください。

SELECT Product.ProductID, Product.ProductName
FROM Product
LEFT JOIN ViewedProduct ON Product.ProductID = ViewedProduct.ProductID
WHERE ViewedProduct.UserID = 55
ORDER BY ViewedProduct.Views
于 2013-02-18T09:57:35.447 に答える
1

これが必要であると考えているため、結合句にユーザー ID を含めるようにクエリを編集しました。ここでフィドルを参照してください:http://www.sqlfiddle.com/#!3/0ef18/1

SELECT
    Product.ProductID,
    Product.ProductName
FROM
    Product
    LEFT JOIN ViewedProduct ON Product.ProductID = ViewedProduct.ProductID AND ViewedProduct.UserID = @userID
WHERE
    ViewedProduct.UserID IS NULL
OR  ViewedProduct.UserID = @userID
ORDER BY
    CASE WHEN ViewedProduct.Views IS NULL THEN 0 ELSE ViewedProduct.Views END DESC,
    Product.ProductID

次の順序で注文するには: UserViews、AllViews、ProductID

以下を使用します。

SELECT
        Product.ProductID,
        Product.ProductName
    FROM
        Product
        LEFT JOIN ViewedProduct ON Product.ProductID = ViewedProduct.ProductID AND ViewedProduct.UserID = @userID
        LEFT JOIN 
        (SELECT
           ProductID,
           SUM(Views) AllViews
         FROM
           ViewedProduct
         GROUP BY
           ProductID) TotalViewedProduct ON Product.ProductID = TotalViewedProduct.ProductID
    ORDER BY
        CASE WHEN ViewedProduct.Views IS NULL THEN 0 ELSE ViewedProduct.Views END DESC,
        TotalViewedProduct.AllViews DESC,
        Product.ProductID
于 2013-02-18T10:00:19.250 に答える