sql >> データベース >  >> RDS >> Mysql

MySQLは多対多の場所を選択します

    記事のID以上のものが必要だと仮定します:

    SELECT a.id
          ,a.other_stuff
      FROM articles a
      JOIN article_category ac
        ON ac.article_id = a.id
    GROUP BY a.id
    HAVING GROUP_CONCAT(DISTINCT ac.category_id ORDER BY ac.category_id SEPARATOR ',') = '1,2'
    

    記事のIDだけが必要な場合は、次のことを試してください。

    SELECT article_id
      FROM article_category 
    GROUP BY article_id
    HAVING GROUP_CONCAT(DISTINCT category_id ORDER BY category_id SEPARATOR ',') = '1,2'
    

    http://sqlfiddle.com/#!2/9d213/4<で実際の動作を確認してください。 / a>

    また、このアプローチの利点は、クエリを変更することなく、任意の数のカテゴリのチェックをサポートできることです。 '1,2'を文字列変数にして、クエリに渡される内容を変更するだけです。したがって、「1,2,7」の文字列を渡すことで、カテゴリ1、2、および7の記事を簡単に検索できます。追加の結合は必要ありません。



    1. ビット単位のフラグは放棄されましたか?

    2. 特に結合中にorderby句で使用される場合、誰かがMySQLインデックスに関する優れたチュートリアルを推奨できますか?

    3. 条件がない場合にクエリが何も返さないようにするにはどうすればよいですか?

    4. MariaDBでサポートされている文字セットの完全なリスト