簡體   English   中英

從表中進行選擇,其中一個列僅包含來自另一列的元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM