用where子句连接表

时间:2018-05-16 05:59:02

标签: mysql

我在MySQL中有两个表;人员表和属性表。 属性表用作人的键值存储。

PERSON
| id |    name |
|----|---------|
|  1 |   Alice |
|  2 |     Bob |
|  3 | Charlie |
|  4 |    Dave |

ATTRIBUTE
| id | person_id |           key |                                        value |
|----|-----------|---------------|----------------------------------------------|
|  1 |         1 |           age |                                           20 |
|  2 |         1 |      hometown |                                      Seattle |
|  3 |         2 |           age |                                           20 |
|  4 |         3 |         hobby |                                     baseball |
|  5 |         3 | ageOfDaughter |                                           20 |
|  6 |         4 |         email |                             dave@example.com |
|  7 |         4 |   latestTweet | The most beautiful thing in the world is me. |

在上面的示例中,现在我想让所有年龄都在20岁的人拥有所有属性。 是否可以通过一个查询获得结果?

(参见SQL小提琴:http://sqlfiddle.com/#!9/9e9e5b/1

4 个答案:

答案 0 :(得分:0)

您只需创建一个内部联接,然后根据您的条件提供where子句。

target

这将为您提供人员和年龄值,然后您可以进一步添加附加条款以获得预期结果。像这样:

SELECT p.name as Name, a.value as Age 
FROM attribute a INNER JOIN person p 
ON a.person_id = p.id
WHERE a.key = 'age'

希望这有帮助!

答案 1 :(得分:0)

我认为您需要创建一个嵌套查询来执行以下内部联接。这是一个例子:

select sub.*
 from (
  SELECT name, person_id, attribute.key, attribute.value FROM person
    inner join attribute on person.id=attribute.person_id
 ) sub
where sub.key="age" && sub.value=20;

可以在这里找到示例小提琴: sqlfiddle

答案 2 :(得分:0)

感谢评论,我终于找到了答案。谢谢大家。

SELECT p.*, GROUP_CONCAT(a.key) as 'keys', GROUP_CONCAT(a.value) as 'values'
FROM person p
LEFT OUTER JOIN attribute a ON p.id = a.person_id
WHERE p.id IN (
  SELECT a.person_id FROM attribute a WHERE a.key = 'age' AND a.value = '20'
)
GROUP BY p.id

http://sqlfiddle.com/#!9/9e9e5b/52

答案 3 :(得分:0)

确定是否存在age = 20的第一个子查询然后join属性以获取所有属性

    SELECT * 
    FROM
    (
    SELECT P.ID PID, P.NAME PNAME, A.ID AID, A.PERSON_ID
    FROM PERSON P
    JOIN ATTRIBUTE A ON A.PERSON_ID = P.ID 
    WHERE `KEY` = 'AGE' AND VALUE = (20)
    ) S
    JOIN
    ATTRIBUTE A ON A.PERSON_ID = S.PID;

+-----+-------+-----+-----------+----+-----------+----------+---------+
| PID | PNAME | AID | PERSON_ID | id | person_id | key      | value   |
+-----+-------+-----+-----------+----+-----------+----------+---------+
|   1 | Alice |   1 |         1 |  1 |         1 | age      | 20      |
|   1 | Alice |   1 |         1 |  2 |         1 | hometown | Seattle |
|   2 | Bob   |   3 |         2 |  3 |         2 | age      | 20      |
+-----+-------+-----+-----------+----+-----------+----------+---------+
3 rows in set (0.00 sec)