5

私はmysqlの世界に不慣れで、データベースから必要なデータを取得するのに問題があります。

私が持っている2つのテーブルは...

結果

ID   | TITLE | LOTS OF OTHER DATA |
1    | res1  |                    |
2    | res2  |                    | 
3    | res3  |                    |
4    | res4  |                    | 
5    | res5  |                    |

カテゴリ

ID   | RESULT_ID |    CATEGORY NAME    |
1    | 1         |      purchase       |
2    | 1         |    single_family    | 
3    | 1         |    conventional     |
4    | 2         |        usda         | 
5    | 3         |    somecategory     |

クエリで提供されるすべてのカテゴリに属する​​結果を選択するクエリを作成しようとしています。たとえば、この例のpurchase&single_family&conventionalのクエリは、結果テーブルの最初の結果を返します。

それは理にかなっていますか?これを行うクエリはありますか、それともデータベース構造に問題がありますか?

どうもありがとう!

4

1 に答える 1

3

次のようなものを試してください。

SELECT * FROM Results r 
INNER JOIN Categories c on r.ID = c.RESULT_ID
WHERE c.name in ('purchase', 'single_family', 'conventional')
GROUP BY r.ID
HAVING COUNT(c.ID) = 3

結合を使用した基本的な選択では、結果1に対してのみ3つの行が取得されます。

編集:データベースを変更した場合にコードが壊れないようにするには、常に明示的に必要なフィールドを選択する必要があります。SELECT r.ID, .. FROM ..

したがって、基本的には、カテゴリ名がリスト内の名前の1つであるすべてのカテゴリについて、すべてのカテゴリテーブルと単純に結合します。最初の3行を手動で実行して、得られる結果を確認してください。

次に、結果IDでグループ化します。これは、同じ結果IDを共有するすべての行を1つの行に集約していることを意味します。最後の行は、3行で集計された集計列をフィルタリングしていることを意味します。つまり、3つの一致するカテゴリを持つ結果のみが返されます。

したがって、このアプローチの唯一の問題は、Categoriesテーブルにresult_id、categorynameが重複している場合です。

于 2012-04-09T19:29:39.603 に答える