[英]Select all rows contains same value in a column
我想 select 所有package_id
包含product_id 2
。 在這種情況下, package_id 1,3,5
具有product_id 2
Table: product_package
package_id package_name product_id
---------------------------------------------
1 Gold 1,2,3
2 Platinum 4,5,12
3 Diamond 2,11,5
4 Titanium 3,5
5 Basic 2
我試過了:
SELECT
*
FROM
product_package
WHERE product_id IN(2)
它僅輸出package_id 3 and 5
。 我如何正確 output 這個? product_id
結構是varchar(256)
。 我應該更改結構還是添加外鍵?
我們始終建議不要存儲分隔列,請參閱在數據庫列中存儲分隔列表真的那么糟糕嗎?
但是您可以使用FIND_IN_SET
但這總是很慢
SELECT
*
FROM
product_package
WHERE FIND_IN_SET(2,product_id)
package_id | 包裹名字 | product_id |
---|---|---|
1 | 金子 | 1,2,3 |
3 | 鑽石 | 2,11,5 |
5 | 基本的 | 2 |
首先,讓我解釋一下您的查詢中發生了什么。
您有WHERE product_id IN(2)
,但 product_id 用詞不當,應該是 product_id s ,因為不幸的是,它是多個 ID 存儲在一個字符串中。 IN
用於在列表中查找值。 但是,您的列表僅包含一個元素,因此您也可以使用相等運算符: WHERE product_id = 2
。
您所擁有的是WHERE string = number
,因此 DBMS 必須轉換其中一個值才能比較兩者。 它將字符串轉換為數字(因此 '2' 匹配 2 並且 '002' 也匹配 2,正如它應該的那樣)。 但是你的字符串不是數字。 例如,DBMS 應該在 '1,2,3' 上引發錯誤,因為 '1,2,3' 不是數字。 然而,MySQL 在這里有一個設計缺陷,無論如何仍然會轉換字符串。 它只需要從左邊開始的字符數,因為它們仍然代表一個數字。 '1' 可以,但是逗號不被視為數字(是的,MySQL 在將字符串隱式轉換為數字時無法處理千位分隔符)。 因此,將 '1,2,3' 轉換為數字會得到 1。同樣,'2,11,5' 會得到 2,所以在 MySQL 中,'2,11,5' = 2 相當令人驚訝。 這就是你得到那一行的原因。
你問“我應該改變結構嗎”,答案是肯定的。 到目前為止,您的表不符合第一范式,因此不應該存在於關系數據庫中。 您將需要兩個表而不是形成 1:n 關系:
表:package
package_id | 包裹名字 |
---|---|
1 | 金子 |
2 | 鉑 |
3 | 鑽石 |
4 | 鈦 |
5 | 基本的 |
表:product_package
package_id | product_id |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
2 | 4 |
2 | 5 |
2 | 12 |
3 | 2 |
3 | 11 |
3 | 5 |
4 | 3 |
4 | 5 |
5 | 2 |
你問“或添加外鍵?” ,答案是添加外鍵。 因此,使用更改后的結構,您希望 product_package(product_id) 引用 product(product_id) 和 product_package(package_id) 引用 package(package_id)。
不管您不應該在單個字段中存儲多個值,您可以使用LIKE
運算符來實現您正在尋找的內容。 我帶着假設去:
select * from product_package
where product_id like '2,%'
or product_id like '%,2,%'
or product_id like '%,2'
or product_id like '2'
或者,您可以使用REGEXP
運算符:
select * from product_package
where product_id regexp '^2$|^2,.+|.+,2,.+|.+,2'
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.