2012-12-20 66 views
2

我有以下問題。選擇在另一個表中具有一組值的行

我對我的項目中的用戶進行過濾,並且我希望從數據庫中僅選擇具有表中所有由$ fm_instrument指定的工具的用戶。

表用戶:

id_user | user_type | 
-------------------------- 
| 1 |  2  | 

表儀器看起來是這樣的:

| id_user_instrument | id_user  | instrument_title | 
---------------------------------------------------------- 
|   1   |  1  |  organ  | 
|   2   |  1  |  flute  | 
|   3   |  1  |  piano  | 

實例:過濾器返回$ fm_instrument = '笛子,風琴'

我這樣做:

if(isset($fm_instrument) && $fm_instrument != '') 
{ 
$instrument_arr = explode(',',$fm_instrument); 
$instrument_sql = ''; 
foreach ($instrument_arr as $i=>$val) // pro kazdy nastroj 
{ 
    if($i != 0) {$instrument_sql.=" AND ";} 
    $instrument_sql .= " ( instrument_title='".$val."') "; 
} 
$instrument_sql_part = " AND ($instrument_sql)"; 
}  

$user_sql ="SELECT * FROM `user` AS pu 
LEFT JOIN instrument AS i USING(`id_user`) WHERE user_type=2 $instrument_sql_part "; 

但它不適用於多個儀器。

我敢肯定,有更好的解決方案,正確的mysql_query,但我的mysql知識不太好。

謝謝你對我的耐心。

+1

只是寫的SQL - SELECT * FROM'user'浦 LEFT JOIN儀器正如我在(pu.id_user =我。 id_user)WHERE user_type = 2 AND instrument_title IN(「flute」,「organ」) – Joddy

+0

我的意思是 - 使用IN子句 – Joddy

+0

@Joddy用戶結果必須匹配**所有**工具而不是一些 –

回答

2

你應該試試這個

SELECT 
    * 
FROM 
    users 
WHERE 
    user_type = 2 
AND 
    id_user IN 
    (SELECT 
     id_user 
     FROM (
     SELECT 
      id_user, 
      GROUP_CONCAT(instrument_title) instrument_titles 
     FROM 
      instrument 
     WHERE 
      FIND_IN_SET(instrument_title, 'flute,organ') 
     GROUP BY 
      id_user) tmp 
     WHERE 
     LENGTH(instrument_titles) = LENGTH('flute,organ')); 

SQL Fiddle DEMO

+0

您可能想要'WHERE FIND_IN_SET(...)> 0' –

+0

@AleksG爲什麼我應該? –

+0

我認爲FIND_IN_SET返回一個整數,表示所尋找的術語的位置。我不太熟悉mysql:它會自動進行類型轉換嗎? –

相關問題