31

私は、エンティティ (それらを人と呼びましょう) とプロパティ (1 人が任意の数のプロパティを持つことができます) のテーブルを持っています。元:

人々

Name  Age
--------
Jane  27
Joe   36
Jim   16

プロパティ

Name   Property
-----------------
Jane   Smart
Jane   Funny
Jane   Good-looking
Joe    Smart
Joe    Workaholic
Jim    Funny
Jim    Young

年齢に基づいて人を選択し、すべてまたは一部のプロパティを返す効率的な選択を書きたいと思います。

Ex: People older than 26
Name Properties
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic

プロパティの 1 つとプロパティの合計数を返すこともできます。

クエリは効率的である必要があります。ピープル テーブルには数百万行、プロパティ テーブルには数十万行があります (したがって、ほとんどの人にはプロパティがありません)。一度に何百もの行が選択されます。

それを行う方法はありますか?

4

3 に答える 3

30

使用する:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
LEFT JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

PROPERTIES.property 値のコンマ区切りリストを返すために、MySQL 関数 GROUP_CONCAT (ドキュメント) が必要です。

PROPERTIES テーブルに値を持たない PEOPLE レコードを含めるために、JOIN ではなく LEFT JOIN を使用しました。PROPERTIES テーブルに値を持つ人のリストのみが必要な場合は、次を使用します。

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
     JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

これは一例であることは承知していますが、「John Smith」がいくつあるかを考えると、名前を使用することは参照整合性にとって不適切な選択です。ユーザーごとに一意の値である user_id を割り当てることをお勧めします。

于 2010-05-23T18:09:34.950 に答える
4

を使用INNER JOINして、2 つのテーブルをリンクできます。JOIN の詳細

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.Name = P.Name
WHERE P.Name = 'Joe' -- or a specific age, etc

ただし、多くの場合、このようなテーブルに一意の主キーを追加し、速度を上げるためにインデックスを作成する方がはるかに高速です。

テーブルPeopleにフィールドがありid
、テーブルにそれらをリンクするPropertiesフィールドがあるとしますpeopleId

次に、クエリは次のようになります。

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.id = P.peopleId
WHERE P.Name = 'Joe'
于 2010-05-23T18:11:23.383 に答える