2010-08-21 35 views
1
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)Mysql在一行中选取/连接多行

谢谢:)

编辑...

啊哈看来这是工作:

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

我不认为这是一个很好的解决方案,因为你使用group_concat函数和功能有th e限制被称为group_concat_max_len。因此可能会发生,你不会得到全部结果。即使限制很高,我宁愿不使用group_concat,因为您可能会将您的应用程序移动到另一台服务器,并且设置可能会有所不同。

我会简单地将查询划分为更简单的查询并在PHP中处理它们(如果是您的情况)。过早的优化并不好。

+0

我们对应用程序一无所知。 maby只有大约5张图片或者其他东西?... 但是你的情况另有一个说法。使用group_concat只是消耗更多的数据库时间和应用程序服务器时间通常更可扩展和更好的权衡;) – 2010-08-21 13:48:28

+1

感谢评论!那么也许有5个图像,但我的经验是,每个系统的复杂性增长,因此我不会写在首位。 – 2010-08-21 14:43:22

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) 

概括起来讲,如果我理解正确的用例: 其最好先了解哪些广告需要显示,然后获取的图像进行正是这个广告没有任何加入!