2014-05-05 73 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