从另一个表中的值排序表

时间:2013-02-18 09:34:40

标签: sql sql-server sql-server-2008 tsql

我有一个表名'产品'

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

用户ID 55视图应位于顶部,所有其他viewdproduct应按其视图总和排序。由两个不同的用户ID查看的产品ID 1总视图为60,为什么它应该排在第二位。和产品ID 3有51个视图,它应该排在第三位。

  

第二个例子:

 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次,产品1位于第三位,UserID 55未查看此产品。但是他们从查看表中的总观看次数是60.而productID 4是最后一次,因为用户55没有查看过这个产品,但是从视图表中看到的总观看次数是50个等等。

- 如果您需要进一步说明,请发表评论

2 个答案:

答案 0 :(得分: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,并且排序只是按升序或降序排序。

如果您想要用户ID 55查看的产品,您需要一个where子句:

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

这将只返回一行,除非样本中的数据多于样本。

如果您想按次数订购,请尝试以下内容:

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

答案 1 :(得分:1)

我已经编辑了查询以在join子句中包含userID,因为我认为这是必要的。请看这里的小提琴: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,     产品ID

使用以下内容:

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