【问题标题】:Selecting all the row having any values equal to the target row选择所有值等于目标行的所有行
【发布时间】:2019-08-02 05:33:16
【问题描述】:

我有表user_product,其中有不同的行,如user,列为他们购买的product。假设我们有一个目标用户user_id 3。那么我要做的是获取所有购买了目标用户购买的任何product 的用户。即具有任何列值等于目标列值的行。

user_id | product_one | product_two | product_three | product_four |
--------------------------------------------------------------------
1       |   1         | 1           |   0           |1             |
--------------------------------------------------------------------
2       |   0         | 1           |   0           |0             |
--------------------------------------------------------------------
3       |   0         | 0           |   1           |1             |
--------------------------------------------------------------------
4       |   0         | 0           |   0           |0             |
--------------------------------------------------------------------
5       |   0         | 1           |   1           |1             |
--------------------------------------------------------------------

这里如果我们的目标行是 3,那么我们应该返回第 3 行(默认情况下因为它的目标行)、第 5 行(因为产品 3 和产品 4)和第 1 行(因为产品 4)

提前致谢。

【问题讨论】:

  • @TimBiegeleisen 更新了它。
  • 你还没有问过问题。顺便说一句:这看起来是一个非常糟糕的数据库设计。您永远不会添加或删除产品吗?因为如果你想这样做,那么产品不应该是列,而只是数据,你需要一个产品表和一个由 user_id + product_id 组成的单独桥接表。
  • 如果您有超过 4 种产品,例如大约 10 种新产品,您的表格会在 product_fourteen 之前有新列吗?
  • @ThorstenKettner 是的,我知道这不是一个好习惯,但我只需要制作一个快速的网络应用程序来演示,因为我坚持使用它的时间跨度很短,所以稍后会更改。
  • @James 但是考虑到产品数量不会改变,我正在制作这个应用程序。

标签: mysql sql mysql-workbench


【解决方案1】:

我们可以尝试使用存在查询来表达这一点:

SELECT p1.*
FROM products p1
WHERE EXISTS (SELECT 1 FROM products p2
              WHERE (p1.product_one = 1 AND p2.product_one = 1 OR
                     p1.product_two = 1 AND p2.product_two = 1 OR
                     p1.product_three = 1 AND p2.product_three = 1 OR
                     p1.product_four = 1 AND p2.product_four = 1) AND
                    p2.user_id = 3);

Demo

但请注意,如果您要更改/规范您的表格设计,您可能会遇到更容易处理的问题。考虑以这种方式存储您的数据:

user_id | product_id
1       | 1
1       | 2
1       | 4
2       | 2
3       | 3
3       | 4
5       | 2
5       | 3

现在我们可以更简单地表述问题:

SELECT t.*
FROM products t
WHERE user_id IN (SELECT p2.user_id FROM products p1 INNER JOIN products p2
                  ON p1.product_id = p2.product_id WHERE p1.user_id = 3);

Demo

【讨论】:

  • @AbhishekPatel 我为您提供了另一种存储数据(和查询)的方法,假设您能够这样做,这可能是一个更好的设计选择。
  • 我会切换到后面的。非常感谢您的帮助。
猜你喜欢
  • 2011-11-07
  • 2020-12-24
  • 1970-01-01
  • 2014-08-22
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多