mysql垂直连接多个表

sd2nnvve  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(456)

我有以下表格:用户,属性,属性值,用户属性值。
不要问我为什么选择这样构造表,我只是想通过使用不同的想法来学习sql(更具体地说是mysql)。
表结构如下:

  1. users
  2. +--+
  3. |id|
  4. +--+
  5. | 1|
  6. +--+
  7. attributes
  8. +--+---------+
  9. |id|attribute|
  10. +--+---------+
  11. | 1|name |
  12. +--+---------+
  13. | 2|age |
  14. +--+---------+
  15. attribute_values
  16. +--+---------------+
  17. |id|attribute_value|
  18. +--+---------------+
  19. | 1|John Doe |
  20. +--+---------------+
  21. | 2|30 |
  22. +--+---------------+
  23. user_attribute_values
  24. +-------+------------+------------------+
  25. |user_id|attribute_id|attribute_value_id|
  26. +-------+------------+------------------+
  27. | 1| 1| 1|
  28. +-------+------------+------------------+
  29. | 1| 2| 2|
  30. +-------+------------+------------------+

我试图找出一个查询,它将导致如下结果:

  1. +-------+---------+---------------+
  2. |user_id|attribute|attribute_value|
  3. +-------+---------+---------------+
  4. | 1|name |John Doe |
  5. +-------+---------+---------------+
  6. | 1|age |30 |
  7. +-------+---------+---------------+

或者更好的办法是这样:

  1. +--+--------+---+
  2. |id| name|age|
  3. +-----------+---+
  4. | 1|John Doe|30 |
  5. +-------+-------+

请记住,所有表中都添加了正确的键和外键。
我能得到的最接近的东西是这样的:

  1. SELECT `users`.`id`, `attributes`.`attribute`, `attribute_values`.`attribute_value`
  2. FROM `users`, `attributes`, `attribute_values`, `user_attribute_values`
  3. WHERE `users`.`id` = `user_attribute_values`.`user_id` AND `user_attribute_values`.`attribute_id` = 1 AND `user_attribute_values`.`attribute_value_id` = 1;

结果是:

  1. +--+---------+---------------+
  2. |id|attribute|attribute_value|
  3. +--+---------+---------------+
  4. | 1| name|John Doe |
  5. +--+---------+---------------+
  6. | 1| age|John Doe |
  7. +--+---------+---------------+
  8. | 1| name|30 |
  9. +--+---------+---------------+
  10. | 1| age|27 |
  11. +--+---------+---------------+
qnzebej0

qnzebej01#

不要在句子中使用逗号 FROM 条款。始终使用适当的、明确的、标准的 JOIN 语法。
正确的连接可能会解决您的问题:

  1. SELECT u.id, a.attribute, av.attribute_value
  2. FROM users u JOIN
  3. user_attribute_values uav
  4. ON u.id = uav.user_id JOIN
  5. attributes a
  6. ON uav.attribute_id = a.id JOIN
  7. attribute_values av
  8. ON uav.attribute_value_id = av.attribute_value_id
  9. WHERE av.id = 1 AND a.id = 1;

我不知道这是怎么回事 WHERE 条款应该是这样做的。我想你真的想 WHERE u.id = 1 基于样本结果。

相关问题