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 ='flute、organ'を返します

そして私はこれをしています:

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に関する私の知識はそれほど良くありません。

しばらくお待ちいただきますようお願いいたします。

4

1 に答える 1

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フィドルデモ

于 2012-12-20T12:38:18.433 に答える