【问题标题】:Order a table from values in another table根据另一个表中的值对表进行排序
【发布时间】:2013-02-18 19:23:42
【问题描述】:

我有一个表名“产品”

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。等等..

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

【问题讨论】:

  • 逻辑在哪里?
  • 那么问题是什么?
  • 要么你的例子是错误的,要么我没听懂......你能解释一下为什么应该返回 ProductID 的 1 和 3 而与 UserID 55 没有关系吗?
  • 缺少与UserID相关的ProductID表

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


【解决方案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

按以下方式订购: 用户视图, 所有视图, 产品编号

使用以下内容:

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

【讨论】:

  • sqlfiddle.com/#!3/e7c08/7 看看.. 我很接近了.. 对于用户 ID 40 产品 ID 1 和 2 是顶部,因为它们分别有 10,1 视图,这很好,但产品 ID 4 应该在第三因为他们的浏览量总和是 80,而产品 3 最终应该是他们的访问量总和是 54
【解决方案2】:

不清楚你在这里问什么,但如果你想从这些表中返回结果并按另一个表中的列对其进行排序,只需在主表和包含你想要的列的表之间创建一个连接排序。这将允许您对连接表中的列进行排序。

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

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多