mysql - 将表多次连接到另一个可能具有或不具有这些值的表

标签 mysql outer-join

我有三个表:

| items
--------
id
quantity
size_attribute_value_id
color_attribute_value_id
type_attribute_value_id

| attribute_values (instance of an attribute, like red, xsmall)
--------
id
attribute_id
name

| attributes (attribute category, like color, size)
id
name 

三个属性(尺寸、颜色、类型)的任意组合都可以构成有效的项目。因此,我希望能够查询这三个属性的所有组合,同时还包括项目表中现有的项目。我的想法是我想要一个包含所有现有项目和所有可能的有效 future 项目的结果集。例如,即使 items 表完全空白,我仍然应该得到不存在但有效且数量为 0 的项目的结果。

有效的 attribute_id 为 1、2、4。

我尝试了以下右连接作为开始:

SELECT i.*, av1.*, av2.*, av3.*
FROM items i 
RIGHT OUTER JOIN attribute_values av1 ON av1.attribute_id = 2 AND av1.id = i.size_attribute_value_id
RIGHT OUTER JOIN attribute_values av2 ON av2.attribute_id = 4 AND av2.id = i.color_attribute_value_id
RIGHT OUTER JOIN attribute_values av3 ON av3.attribute_id = 1 AND av3.id = i.type_attribute_value_id;

但它只返回大约 200 行,而实际应该超过 1000 行。

任何帮助,即使只是正确方向的一点,我们都会表示赞赏。

最佳答案

SELECT a1.name as `type`, a2.name as `size`, a4.name as `color`, SUM(COALESCE( i.quantity , 0 ) ) as quantity
FROM (attribute_values a1, attribute_values a2, attribute_values a4)
LEFT JOIN items i
ON i.type_attribute_value_id = a1.id
AND i.size_attribute_value_id = a2.id
AND i.color_attribute_value_id = a4.id
WHERE a1.attribute_id = 1 AND a2.attribute_id = 2 AND a4.attribute_id = 4
GROUP BY a1.name, a2.name, a4.name

这假设您的项目表中除了类型、大小和颜色之外还有很多其他属性,并且可能有更多列,如果没有,最好将属性放在单独的表中,例如类型、颜色和大小,这将更容易查询,并且当您的数据库变大时,通过适当的索引可以显着提高性能。

关于mysql - 将表多次连接到另一个可能具有或不具有这些值的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9333715/

相关文章:

Java:如何使用 "this"访问外部类的实例变量?

java - 在 HQL 查询中使用外连接

mysql - SQL select 将两列合并为一列

mysql - 通过变量和声明变量时的错误设置结果限制

带条件的 MySQL 更新触发器

java - 对称 DS 异常

mysql - 外连接两个select语句的输出-mysql

php - 从同一个表但不同时间范围检索数据的最佳方法是什么?

MySQL INSERT 和基于匹配列的 SELECT

PostgreSQL OUTER 连接逻辑