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 应按其视图总和排序。产品 id 1 由两个不同的 UserID 查看,他们的总查看次数是 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 次,productid 1 排在第三位 UserID 55 没有查看此产品。但他们从查看表中获得的总浏览量为 60。而 productID 4 排在最后,因为用户 ID 55 尚未查看此产品,但从查看表中获得的总浏览量为 50。依此类推。

-- 如果您需要进一步解释,请发表评论

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

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

如果您想按观看次数排序,请尝试以下操作:

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

我已经编辑了查询以在 join 子句中包含用户 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 回答