我需要连接两个表,并追加某些数据匹配的列。这两个表的设置如下:
Apple | Flavor
Fuji | 1
Red Delicious | 2
Flavor | Quality
1 | Sour
1 | Sweet
2 | Bitter
2 | Sweet
我需要为每个匹配的风味质量添加一列,如下所示:
Apple | Quality 1 | Quality 2
Fuji | sour | sweet
Red Delicious | bitter | sweet
注意我还需要为附加的每个列标题附加一个自动整数。
这似乎是一项艰巨的任务,我不知道从哪里开始?这甚至可能吗?感谢您的帮助。
答案 0 :(得分:1)
您不能拥有可变数量的列。使用一个查询来获取苹果,然后循环结果集以获取它们的质量。如果愿意,可以使用服务器端脚本语言将结果集合并在一起。
答案 1 :(得分:1)
对于马克所说的,你可以拥有可变数量的列。虽然我在这里展示它实际上是多么无稽之谈。
通常你会有一个像
这样的声明SELECT * FROM apples a JOIN flavors f ON a.flavor = f.flavor;
那么你在应用程序级别上做的很少巫术,就是这样。以下是这个简单查询如何获得静态列数:
select
Apple,
max(case when my_quality_numbering = 1 then Quality else null end) as Quality1,
max(case when my_quality_numbering = 2 then Quality else null end) as Quality2
from (
select
a.Apple,
f.Quality,
case when (if(@prev_apple != a.Apple, @quality_no := 1, @quality_no := @quality_no + 1)) is null then null
when (@prev_apple := a.Apple) is null then null
else @quality_no end as my_quality_numbering
from
apples a
join flavors f on a.Flavor = f.Flavor
, (select @quality_no := 0, @prev_apple := NULL) v
order by a.Apple
) sq
group by Apple
这只是工作的一半。要拥有可变数量的列,您必须编写一个存储过程,从内部查询中读取需要多少列。然后,您必须为外部查询构建查询字符串,并通过预准备语句执行所有这些操作。几乎可以用于简单的查询。再说一遍,我上面的查询只是为了好玩,但总的来说它真的不值得这么麻烦。
答案 2 :(得分:1)
您可以将相关行组合在一起,并连接相应组的质量值。这会生成一个列,一个以逗号分隔的值的字符串。请参阅GROUP_CONCAT()。
SELECT a.Apple, GROUP_CONCAT(f.Quality) AS Qualities
FROM apples a JOIN flavors f ON a.flavor = f.flavor
GROUP BY a.Apple;
这并不完全符合您的要求,因为它不会将质量值分隔为单独的列。但这是一个非常简单的查询,在您将其提取回应用程序后,您可以explode()一系列品质。