2012-12-20 3 views
2

다음과 같은 문제점이 있습니다.다른 테이블에 값 집합이있는 행을 선택하십시오.

필자는 내 프로젝트에서 사용자 필터를 사용하고 있으며 데이터베이스에서 선택하려면 $ infilename으로 지정된 모든 악기를 inastrument 테이블에 가지고 있어야합니다.

테이블 사용자 :

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

예 : 필터는 반환이 $ fm_instrument = '피리, 기관'

내가이 일을 :

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

테이블 기기는 다음과 같습니다

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의 지식은 그리 좋지 않습니다.

양해 해 주셔서 감사합니다. = 폴리 우레탄 LEFT 내가 ON (pu.id_user 그대로 악기를 가입 AS user``로부터 SELECT * 난을 -

+1

을 시도 제공해야합니다. id_user) WHERE user_type = 2 AND instrument_title IN ("플루트", "오르간") – Joddy

+0

내 말은 - IN 절 – Joddy

+0

을 사용하십시오. @Joddy 사용자 결과는 ** 모든 ** 악기와 일치해야합니다. –

답변

2

이는 그냥 SQL을 작성

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에 익숙하지 않다 : 자동 형 변환을 할 것인가? –

관련 문제