在一个绝对错误的代码中,我正在尝试做类似的事情:
SELECT * FROM table2 WHERE
table2.items CONTAINS ONLY ELEMENTS FROM table1.item
这有点令人困惑,但我试着解释一下:
我有一个表 (table1),其中有一列每行有一个元素(我们称它们为 A、B、C、D)
id - [item]
1 - ["A"]
2 - ["B"]
3 - ["C"]
4 - ["D"]
然后我有另一个表 (table2),其列包含如下字符串:
TABLE2
row# - [items]
row1 - ["A, B"]
row2 - ["A, B, C"]
row3 - ["A, B, C, E"]
我想要的是仅从 table2 中选择仅包含 table1 中存在的元素的行,即本例中的 row1 和 row2。
是否可以在不改变表结构的情况下做到这一点?否则,我需要进行哪些更改?
----------[编辑]------------
所以我改变了我的结构,以便能够使用 IN 运算符并且它工作(几乎)很好! 然而新的问题又来了。 由于我的 table2 字符串长度不同,我的新 table2 有一些空单元格。
---[更新]---
所以如果我想检查一下
|item1|item2|item3|item4| row |
| A | B | C | | 2 |
row2在table1.item中(同上),我要求的条件之一是
WHERE NULL IN table1.item
事实并非如此!我需要的是仅在项目不为 NULL 时检查该项目是否在另一个表中。我试着玩那个
最佳答案
是的,这是可能的。一种简单的方法是使用子查询。那将是这样的:
SELECT * FROM table1 WHERE some_value IN (SELECT some_value from table2);
这将返回表 1 中的所有内容,其中 some_value 存在于表 2 的列 some_value
如果你的 table2 是这样的:
|ID | Value | Group_id|
| 1 | A | 1 |
| 2 | B | 1 |
| 3 | C | 1 |
| 4 | A | 2 |
| 5 | B | 2 |
这将表示第 1 组中的“A、B、C”和第 2 组中的“A、B”。现在,您可以很容易地在不同的行中检索与任何组关联的所有值。据我从您最初的问题中可以看出,该表中不应包含任何 NULL 值(正如您在更新中提到的那样)
现在,要确定仅包含表 1 中存在的元素的所有组,您可以:
SELECT group_id FROM table2 WHERE group_id NOT IN (SELECT group_id FROM table2 WHERE value NOT IN (SELECT value from table1));
这会生成一组包含 table1 中所有值的结果,然后返回所有具有该组之外的值的 group_id,然后取反。有点复杂,可能有更好的方法...
关于mysql - 从表中选择,其中一列仅包含另一列的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34473082/