我在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)
答案 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
答案 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)