![](/img/trans.png)
[英]How to select from a table in SQL where element in a column contains only one feature of another column which in turn contains two features in itself?
[英]SELECT from a table where a a column contains only elements from another column
在絕對錯誤的代碼中,我正在嘗試執行以下操作:
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);
這將返回table1的所有內容,其中table2的列some_value
存在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,然后對其求反。 有點復雜,可能有更好的方法來做...
您的數據布局很差。 在SQL中,將事物列表存儲在行中是個壞主意。 原因如下:
有時,您會陷入別人的錯誤設計決定中。 MySQL具有一些可以提供幫助的功能。 例如,如果“列表”只是逗號分隔的字符串:
SELECT t2.items
FROM table2 t2 LEFT JOIN
table1 t1
ON find_in_set(t1.item, t2.items) > 0
GROUP BY t2.items -- or this should really be an id column if available
HAVING COUNT(*) = LENGTH(t2.items) - LENGTH(REPLACE(t2.ITEMS, ',', ''));
您的列表格式包含空格,因此您需要刪除它們:
SELECT t2.items
FROM table2 t2 LEFT JOIN
table1 t1
ON find_in_set(t1.item, replace(t2.items, ' ', '')) > 0
GROUP BY t2.items -- or this should really be an id column if available
HAVING COUNT(*) = LENGTH(t2.items) - LENGTH(REPLACE(t2.ITEMS, ',', ''));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.