Mysql在一行中选择/连接多行

时间:2010-08-21 09:52:34

标签: mysql

SELECT `a`.`department`, `a`.`category`, `a`.id, 
 (SELECT group_concat(t_0) FROM images WHERE ad_id=a.id) t_0,
 (SELECT group_concat(t_1) FROM images WHERE ad_id=a.id) t_1,
 (SELECT group_concat(t_1) FROM images WHERE ad_id=a.id) t_8 
 FROM `ads` AS `a`
 WHERE (a.department = 1) AND (a.category = 12) AND (a.charged=1) 
 ORDER BY `a`.`id` DESC

有比这更好的解决方案吗? 我需要为每个a.id(ad_id)

提供图像表中的所有图像

谢谢:)

...编辑

啊哈,看来这是有效的:

SELECT `a`.`department`, `a`.`category`, `a`.id, group_concat(t_0), group_concat(t_1), group_concat(t_8)
 FROM `ads` AS `a`
 LEFT JOIN images i ON i.ad_id=a.id
 WHERE (a.department = 1) AND (a.category = 12) AND (a.charged=1) 
 GROUP BY a.id DESC

不知道这是否是正确的解决方案......:)

2 个答案:

答案 0 :(得分:2)

我不认为这是一个很好的解决方案,因为您使用group_concat函数,该函数的限制称为group_concat_max_len。因此,您可能无法获得整个结果。即使限制很高,我也不愿意使用group_concat,因为您可能将应用程序移动到另一台服务器,并且设置可能不同。

我只是简单地在简单的查询中划分查询并在PHP中处理它们(如果是这种情况)。过早的优化并不好。

答案 1 :(得分:0)

你的第二种方法看起来并不那么糟糕,但这取决于表的大小和成功连接的数量...... 如果你有很多想象,这可能会更快地执行,但是你只有图像,并且必须在第二次运行时将它们链接到其他信息:

select t_0,t_1,t_8,ad_id from images where ad_id is in (select id from ads  WHERE department = 1 AND category = 12 AND charged=1)

如果我正确理解你的用例,总结一下: 最好先看看哪些广告需要展示,然后在没有任何联接的情况下获取完整广告的图片!