不幸的是,你的結構表中的方式,你必須檢查的「美國模式匹配「在你的字符串開頭,中間或結束。你能做到這一點
一種方法是使用類似如下:
SELECT *
FROM destinations
WHERE destinations LIKE ('%US%');
另一種方法是使用REGEXP:
SELECT *
FROM destinations
WHERE destinations REGEXP '.*US.*';
另一種是使用FIND_IN_SET,由Sadkhasan解釋。
CAVEAT
這一切都不會提供了極大的性能或數據的完整性,雖然。當您將搜索條件添加到標準時,他們將全部實現其性能問題。
E.g.使用FIND_IN_SET,由Sadkhasan建議,你會做這樣的事情:
SELECT * FROM destinations
WHERE FIND_IN_SET('US',destinations)
OR FIND_IN_SET('CA',destinations)
OR FIND_IN_SET('ET',destinations);
使用REGEXP好一點,雖然REGEXP是天生的慢:
SELECT *
FROM destinations
WHERE destinations REGEXP '.*US|CA|ET.*';
那現在?
你最好的選擇將被切換到3NF設計,通過拆分申請產品分爲2代表的目的地,你可以加入,例如:
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
userId INT NOT NULL REFERENCES users(id),
name VARCHAR(255) NOT NULL
) TYPE=InnoDB;
,那麼你會添加什麼叫做複合鍵的表,每行包含一個productId和一個國家,每個國家一行。
CREATE TABLE product_destinations (
productId INT NOT NULL REFERENCES products(id),
country VARCHAR(2) NOT NULL,
PRIARY KEY (productId, country)
) TYPE=InnoDB;
本表數據看起來像:
productId | country
----------|--------
1 | US
1 | CA
1 | ET
2 | US
2 | GB
然後,你可以構建這樣的查詢:
SELECT p.*
FROM products AS p
INNER JOIN product_destinations AS d
ON p.id = d.productId
WHERE d.country IN ('US', 'CA', 'ET')
GROUP BY p.id;
它在SELECT重要添加組(或DISTINCT條款),因爲單個產品可能會出貨給多個國家,導致多行匹配 - 彙總會將這些數據減少爲每個產品ID的單個結果。
一個額外的好處是你不必更新你的國家列和做字符串操作,以確定該國是否已經存在。你可以讓數據庫爲你做,並插入 - 防止鎖定問題,這將進一步複合你的問題。
首先正常化數據 – Strawberry
我建議你把目的地爲表內的'[..]'像字符'[美國] [SE] [德] '然後你可以通過執行'SELECT * FROM destinations where'destination LIKE('%[US]%')來獲得包含'US'的記錄。'' –
@Strawberry每一行都屬於一個特定的用戶。 UserId 1將發貨到美國,東南,德國等等。 – Norman