MySQL垂直连接多个表

MySQL垂直连接多个表,mysql,sql,pivot,entity-attribute-value,Mysql,Sql,Pivot,Entity Attribute Value,我有以下表格:用户,属性,属性值,用户属性值 不要问我为什么选择这样构造表,我只是尝试通过使用不同的想法来学习SQL(更具体地说是MySQL) 表结构如下: users +--+ |id| +--+ | 1| +--+ attributes +--+---------+ |id|attribute| +--+---------+ | 1|name | +--+---------+ | 2|age | +--+---------+ attribute_values +--+-

我有以下表格:用户属性属性值用户属性值

不要问我为什么选择这样构造表,我只是尝试通过使用不同的想法来学习SQL(更具体地说是MySQL)

表结构如下:

users
+--+
|id|
+--+
| 1|
+--+

attributes
+--+---------+
|id|attribute|
+--+---------+
| 1|name     |
+--+---------+
| 2|age      |
+--+---------+

attribute_values
+--+---------------+
|id|attribute_value|
+--+---------------+
| 1|John Doe       |
+--+---------------+
| 2|30             |
+--+---------------+

user_attribute_values
+-------+------------+------------------+
|user_id|attribute_id|attribute_value_id|
+-------+------------+------------------+
|      1|           1|                 1|
+-------+------------+------------------+
|      1|           2|                 2|
+-------+------------+------------------+
我试图找出一个查询,它将导致如下结果:

+-------+---------+---------------+
|user_id|attribute|attribute_value|
+-------+---------+---------------+
|      1|name     |John Doe       |
+-------+---------+---------------+
|      1|age      |30             |
+-------+---------+---------------+
+--+--------+---+
|id|    name|age|
+-----------+---+
| 1|John Doe|30 |
+-------+-------+
SELECT `users`.`id`, `attributes`.`attribute`, `attribute_values`.`attribute_value`
FROM `users`, `attributes`, `attribute_values`, `user_attribute_values`
WHERE `users`.`id` = `user_attribute_values`.`user_id` AND `user_attribute_values`.`attribute_id` = 1 AND `user_attribute_values`.`attribute_value_id` = 1;
或者更好的是,像这样的事情:

+-------+---------+---------------+
|user_id|attribute|attribute_value|
+-------+---------+---------------+
|      1|name     |John Doe       |
+-------+---------+---------------+
|      1|age      |30             |
+-------+---------+---------------+
+--+--------+---+
|id|    name|age|
+-----------+---+
| 1|John Doe|30 |
+-------+-------+
SELECT `users`.`id`, `attributes`.`attribute`, `attribute_values`.`attribute_value`
FROM `users`, `attributes`, `attribute_values`, `user_attribute_values`
WHERE `users`.`id` = `user_attribute_values`.`user_id` AND `user_attribute_values`.`attribute_id` = 1 AND `user_attribute_values`.`attribute_value_id` = 1;
请记住,所有表中都添加了正确的键和外键

我能得到的最接近的东西是这样的:

+-------+---------+---------------+
|user_id|attribute|attribute_value|
+-------+---------+---------------+
|      1|name     |John Doe       |
+-------+---------+---------------+
|      1|age      |30             |
+-------+---------+---------------+
+--+--------+---+
|id|    name|age|
+-----------+---+
| 1|John Doe|30 |
+-------+-------+
SELECT `users`.`id`, `attributes`.`attribute`, `attribute_values`.`attribute_value`
FROM `users`, `attributes`, `attribute_values`, `user_attribute_values`
WHERE `users`.`id` = `user_attribute_values`.`user_id` AND `user_attribute_values`.`attribute_id` = 1 AND `user_attribute_values`.`attribute_value_id` = 1;
其结果是:

+--+---------+---------------+
|id|attribute|attribute_value|
+--+---------+---------------+
| 1|     name|John Doe       |
+--+---------+---------------+
| 1|      age|John Doe       |
+--+---------+---------------+
| 1|     name|30             |
+--+---------+---------------+
| 1|      age|27             |
+--+---------+---------------+
切勿在
FROM
子句中使用逗号。始终使用正确、明确、标准的
JOIN
语法

正确的联接可能会解决您的问题:

SELECT u.id, a.attribute, av.attribute_value
FROM users u JOIN
     user_attribute_values uav
     ON u.id = uav.user_id JOIN
     attributes a
     ON uav.attribute_id = a.id JOIN
     attribute_values av 
     ON uav.attribute_value_id = av.attribute_value_id
WHERE av.id = 1 AND a.id = 1;

我不确定
WHERE
子句应该做什么。根据示例结果,我假设您确实想要
其中u.id=1

谢谢,我将此标记为答案。是否可以构造一个将导致第二种形式的查询?意味着从垂直到水平的总转换?@xandrw。不容易。这需要动态SQL。SQL查询必须显式列出要返回的列,对于该版本,列位于数据中,而不是常量。