簡體   English   中英

Select 所有行在一列中包含相同的值

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

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