4

私には、人、属性、および属性の潜在的な値を含む3つのテーブルがあります。すべての人、各人の属性、およびそれらの欠落/null属性を表示するクエリを理解できません。

これがテーブルの例です...

attributes
+---------------------+
| attribute_name (col)|
+---------------------+
| name                |
+---------------------+
| age                 |
+---------------------+
| gender              |
+---------------------+
| email               |
+---------------------+

people
+-----------+----------+
| person_id | value_id |
+-----------+----------+
| 2         | 7        |
+-----------+----------+
| 2         | 9        |
+-----------+----------+
| 3         | 8        |
+-----------+----------+

values
+---------------+----------------+-------+
| value_id (pk) | attribute_name | value |
+---------------+----------------+-------+
| 7             | age            | 35    |
+---------------+----------------+-------+
| 8             | age            | 28    |
+---------------+----------------+-------+
| 9             | gender         | male  |
+---------------+----------------+-------+


3つのテーブルを結合して、このようなものを表示するにはどうすればよいですか?

+-----------+----------+-----------------+--------+
| person_id | value_id | attribute_name  | value  |
+-----------+----------+-----------------+--------+
| 2         | 7        | age             | 35     |
+-----------+----------+-----------------+--------+
| 2         | 9        | gender          | male   |
+-----------+----------+-----------------+--------+
| 2         | NULL     | name            | NULL   |
+-----------+----------+-----------------+--------+
| 2         | NULL     | email           | NULL   |
+-----------+----------+-----------------+--------+
| 3         | 8        | age             | 28     |
+-----------+----------+-----------------+--------+
| 3         | NULL     | gender          | NULL   |
+-----------+----------+-----------------+--------+
| 3         | NULL     | name            | NULL   |
+-----------+----------+-----------------+--------+
| 3         | NULL     | email           | NULL   |
+-----------+----------+-----------------+--------+
4

4 に答える 4

3
SELECT  a.person_ID, 
        MAX(c.value_ID) value_ID, 
        b.attribute_name ,  
        MAX(c.value) Value
FROM    people a
        CROSS JOIN attributes b       
        LEFT JOIN `values` c
            ON  a.value_ID = c.value_ID AND
                b.attribute_name = c.attribute_name
GROUP BY a.person_ID, b.attribute_name
于 2013-02-03T17:24:55.253 に答える
0

WHEREステートメント(SQL Basics)を使用して3つのテーブルを結合します。

投稿する前に検索しましたか?

nullの場合、この投稿がありますMySQLクエリでNull結果を表示-INNER JOINまたはこのMysqlを使用して4つのテーブルを結合し、NULL値を表示します

;-)

于 2013-02-03T17:11:53.813 に答える
0
select
    person_id,
    attributes.attribute_name as attribute_name,
    values.value as value
from people
cross join attributes
left join values on people.value_id=values.value_id
                and attributes.attribute_name=values.attribute_name
于 2013-02-03T17:15:49.857 に答える
0

期待される出力を開始点として使用すると、基本的に、属性と個別の人々の外積をpeopleto の (n 内部) 結合の結果に結合したままにする必要がありpeopleますvalues。これは、SQL (特に MySQL) でスクリプトを作成する方法です。

SELECT
  p.person_id,
  v.value_id,
  a.attribute_name,
  v.value
FROM 
  (SELECT DISTINCT person_id FROM people) p
  CROSS JOIN attributes a
  LEFT JOIN
    people d
    INNER JOIN `values` v ON d.value_id = v.value_id
  ON p.person_id = d.person_id
  AND a.attribute_name = v.attribute_name
;
于 2013-02-03T18:27:18.910 に答える