絞り込みの検索機能を実装中で悩んでおります。
例えば品物とカテゴリーの中間テーブルがあるとします。
itemsテーブル
id | title |
---|---|
1 | シーフードカレー |
2 | 肉じゃが |
3 | 品物C |
category_itemテーブル
id | item_id | category_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 1 |
5 | 2 | 2 |
categoriesテーブル
id | category_name |
---|---|
1 | 肉類 |
2 | 野菜類 |
3 | 魚介類 |
上記をJOINしてくると以下のような結果になるかと思います。
sql
1SELECT i.id, i.title, ci.category_id FROM items AS i INNER JOIN category_item AS ci ON i.id = ci.item_id
id | title | category_id |
---|---|---|
1 | シーフードカレー | 1 |
1 | シーフードカレー | 2 |
1 | シーフードカレー | 3 |
2 | 肉じゃが | 1 |
2 | 肉じゃが | 2 |
やりたいことはitemsのidを重複しない取得をしたいです。
id | title | category_id |
---|---|---|
1 | シーフードカレー | 1 |
1 | 肉じゃが | 1 |
GROUP BYなどでグルーピングする方法も調べたら出てきたのですが、
このほかにも複数のテーブルをJOINしたり取得するカラムも別テーブルの項目を取得したいためGROUP BYを使用するとエラーになりうまくいきませんでした。
またサブクエリの使い方に関しても調べると出てくるのですが該当の取得方法をしたい時の書き方が分かりませんでした。
良き方法ご存知でしたらご教授いただきたいです。
よろしくお願いします。
補足
MySQL5.7になります。
タイトルを調整いたしました。
SELECT文が間違えていたので修正しました。
カテゴリー名が分かりづらかったので修正しました
補足2
通常であれば、絞り込み検索で検索されない限り
sql
1SELECT i.id, i.title FROM items AS i ORDER BY i.id DESC;
上記のようなSELECT文で一覧を出力させますが、絞り込み検索でチェックボックスでカテゴリーを選択した際に、
sql
1SELECT 2 i.id, i.title, ci.category_id 3FROM 4 items AS i 5INNER JOIN 6 category_item AS ci ON i.id = ci.item_id 7WHERE 8 ci.category_id = 2 9OR 10 ci.category_id = 1 11ORDER BY i.id DESC
上記のようにSQL(当初考えた)が変化します。
複数の条件にマッチした同様のアイテム情報がレコードに出てきてしまうので
id | title | category_id |
---|---|---|
2 | 肉じゃが | 1 |
2 | 肉じゃが | 2 |
1 | シーフードカレー | 1 |
1 | シーフードカレー | 2 |
これを
id | title | category_id |
---|---|---|
1 | 肉じゃが | 1 |
2 | シーフードカレー | 1 |
このようにできて一覧表示用の重複のないデータにできないかと考えておりました。
説明わかりづらく大変申し訳ありません。









回答3件
あなたの回答
tips
プレビュー