我有一个表名'产品'
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个等等。
- 如果您需要进一步说明,请发表评论
答案 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