2014-05-05 31 views
0

我有表:MySQL的:选择里面()函数

tasks_whatwhom | CREATE TABLE tasks_whatwhom (
id int(3) NOT NULL AUTO_INCREMENT, 
name varchar(150) NOT NULL, 
    message varchar(255) NOT NULL, 
    filial_list text, 
    client_list text, 
    PRIMARY KEY (id), 
    UNIQUE KEY name (`name`) 
) ENGINE=Aria AUTO_INCREMENT=53 DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 

filial_list看起来像'12,14'

还有另一张表filials这个表格包含关于filial的附加信息。

SQL语句:

select * from filials where id IN(14,12) and status=1; 

作品期待,但低于 - 返回零。我不明白为什么?

select * from filials where id IN(select filial_list from tasks_whatwhom) and status=1; 
+0

大多数时候在字段中保存逗号分隔列表并不是个好主意。它们是字符串而不是值的列表。改为使用单独的表格。你可以使用[FIND_IN_SET](https://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set),但它不能很好地扩展。 – VMai

+0

您从“从tasks_whatwhom选择filial_list”获得了什么输出? ? –

+0

@JosephB'14,12' – Andry

回答

0

你有一个不好的数据库设计,你不应该以逗号分隔存储数据,而应该为每个相关数据存储一行。

你的情况的一种解决方案是为

select 
f.* 
from 
filials f 
inner join tasks_whatwhom tww on find_in_set(f.id,tww.filial_list); 

除此之外,如果你改变了数据库结构,转变filial_listint并存储,每一列都从filials的引用ID将是更美好。

+0

是的,我知道。这是我的第一个php \ db应用程序。谢谢:-) – Andry

+0

好吧,更具体的理由将其拆分成多行是因为当你在这些表中有大量数据时,find_in_set会很慢,然后你需要从最开始就需要'index'为了使它在将来当你有大量的数据,你可以申请索引和查询将更快:) –

+0

我认为我必须改变数据库结构。 – Andry

0
select * from filials where id IN(select filial_list from tasks_whatwhom) and status=1; 

嗯......你就必须有一个等于Filial_list的值并具有1件

您的查询作品filials.status值,但您的标准不的ID。首先filials_list是一个文本字段,ID字段是int。那么为什么你会期待一场比赛呢?

其次,您在该字段中存储逗号分隔值,该值在int上不匹配。

您将不得不解析该列,每次都拉出数字,然后看看是否有匹配。

+0

我看到我无法纯粹借助SQL解决我的问题。好的,首先选择PHP,从“filials”选择filial和第二需要的行。 – Andry