2013-02-03 86 views
3

我有三個表與人,屬性和屬性的潛在價值。我找不出一個查詢來顯示所有的人,每個人的屬性和他們的缺失/空屬性。

下面是一個例子表...三個表的MySQL查詢

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 | 
+---------------+----------------+-------+ 


如何加入三個表來顯示這樣的事情?

+-----------+----------+-----------------+--------+ 
| 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 | 
+-----------+----------+-----------------+--------+ 

回答

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 
+0

感謝您花時間爲JW設置一切。這正是我想要的。 – dai

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 
+0

問題是顯示每個人可能具有的缺失屬性。 – dai

+0

這是最簡潔的,但我得到一些重複。感謝您花時間貢獻薩達姆 – dai

0

使用您的預計產量爲出發點,你本質上是想要的交叉產品貢品和不同的人people被加入peoplevalues(n內部)連接的結果。這就是你如何在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 
; 
+0

感謝Andriy爲您提供的方法。 – dai