MySQL选择具有不同值的所有行相同的列

Posted

技术标签:

【中文标题】MySQL选择具有不同值的所有行相同的列【英文标题】:MySQL select all rows with different values same column 【发布时间】:2021-03-30 17:15:19 【问题描述】:

我有以下表格:

表配置:

id config
1 ip
2 os
3 cpu

表格选项

id config_id option
1 1          127.0.0.1
2 1          192.168.0.1
3 2          windows
4 2          linux
5 3          AMD
6 3          Intel

table options 中的 config_id 列是 table configs 中 id 字段的外键

我有第三张表 users_configs 将用户与配置和选项联系起来,如下所示:

表 users_configs

id user_id config_id, option_id
1 123      1          1
2 456      2          2
3 789      3          3

我希望同时拥有以下两个选项的所有用户:

- os: windows
- cpu: AMD

我尝试了以下查询,但由于 OR,这将返回所有具有 os:windows OR cpu: AMD 的用户。

SELECT * FROM users_configs 
LEFT JOIN options ON options.id = users_configs.option_id
WHERE (options.config_id = 2 OR options.config_id = 3)

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以使用连接,以便将一行 user_configs 与另一行 user_configs 进行比较,以使它们具有相同的 user_id,然后将这些行中的每一行连接到 os 和 cpu 值的相应查找表。

SELECT u1.user_id
FROM users_configs AS u1
JOIN users_configs AS u2 ON u1.user_id=u2.user_id
JOIN config AS c1 ON u1.config_id=c1.id
JOIN config AS c2 ON u2.config_id=c2.id
JOIN options AS o1 ON u1.option_id=o1.id
JOIN options AS o2 ON u2.option_id=o2.id
WHERE c1.config='os' AND o1.option='windows'
  AND c2.config='cpu' AND o2.option='AMD'

【讨论】:

【参考方案2】:

你可以使用聚合:

SELECT uc.user_id
FROM users_configs uc JOIN
     options o
     ON o.id = uc.option_id join
     config c
     ON c.id = uc.config_id
WHERE (c.config = 'os' AND o.option 'windows') OR 
      (c.config = 'cpu' AND o.option = 'AMD')
GROUP BY uc.user_id
HAVING COUNT(DISTINCT c.config) = 2;

获得具有 either 选项的用户的位置。 HAVING 保证用户同时拥有两者。

【讨论】:

如果 user_configs(user_id, config_id) 有唯一约束,这不会只给出指定的答案吗?尽管 OP 没有说明是否对源数据强制执行唯一性,也没有说明如果存在非唯一记录,查询的预期行为。 @symcbean 。 . .我希望数据没有重复,但此查询中没有任何要求。

以上是关于MySQL选择具有不同值的所有行相同的列的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:删除所有行中具有相同值的列

如何通过熊猫或火花数据框删除所有行中具有相同值的列?

MySQL - 选择共享相同 ID 的所有行,每行包含等于 null 的列

从不同的相关记录组中选择两列之一中包含重复值的所有行

如何选择在某列中具有相同值的所有行

查询以返回在所有行中对于一列的每个不同值具有相同值的行值