2014-09-04 43 views
-1

IAM MySQL中的新手如何匹配存储在MySQL表中的一列中的csv?

我已经CSV格式存储的用户的利益

说person_interests列存储在人表中的多个利益,说

$row['person_interests']='11,22,33,44' 

利益表11 =音乐,22 =旅游等

现在我想列出所有有兴趣的11人,我应该在WHERE子句之后使用什么?

SELECT * FROM persons WHERE ????? 
INNER JOIN 
interests 
ON 
persons.person_interest 
= 
interests.interest_id 
WHERE 
interest.interest_id=11 
+1

虽然@Barmar已经提到这个问题,我想强调的** **,这是一个不好的想法将多个值存储在单个列中。 – Kermit 2014-09-04 00:31:00

回答

0

将逗号分隔的数据存储在SQL表中是一个坏主意。你应该使用一个多对多的关系表来保存这个。它使得搜索和修改数据变得更加复杂,并且匹配值无法使用索引,因此查询效率低下。

但是,如果您坚持使用它,您可以使用FIND_IN_SET来匹配它们。

SELECT * 
FROM persons AS p 
INNER JOIN interests AS i ON FIND_IN_SET(i.interest_id, p.person_interest) 
WHERE i.interest_id = 11 

而不是把所有的利益在一列的,你应该有一个关系表:

CREATE TABLE person_interests (
    person_id INT NOT NULL, -- Foreign key to persons table 
    interest_id INT NOT NULL, -- Foreign key to interests table 
    UNIQUE INDEX (person_id, interest_id), 
    INDEX (interest_id) 
); 
+0

Thankyou.would请你说为什么它的坏主意存储在CSV?存储这些数据的好例子? – tom 2014-09-04 00:43:44

+0

我已经添加了更多关于为什么这是一个坏主意的解释,并且显示你应该做什么。 – Barmar 2014-09-04 00:49:43

+0

@tom您应该了解更多关于MySQL如何工作和关系数据库的信息,并且您会理解为什么,您现在正在做的是如此糟糕和低效,以及如何利用数据库的更多优势,而不是过度思考困难的方式以您想要的方式获取数据。 – Prix 2014-09-04 01:20:21

相关问题