我正在加入3张桌子。最后一个包含每个项目的几张照片。这个想法是每个项目获得一个记录,只有一个随机选择的照片。 ORDER会有所不同,WHERE会有所不同。 我能得到的最好的是一个子查询。 有一种更有效的方法吗?
SELECT *
FROM (
SELECT *
FROM art
LEFT JOIN prov USING ( provID )
LEFT JOIN photos USING ( artID )
WHERE artBrand = "Shimano" AND catID=5 AND (stock1>0 OR stock2>0) AND itemName LIKE "%20mm%"
//the WHERE changes wildly, this is only an example
ORDER BY rand( ) // sometimes is rand, sometimes price, sometimes stock...
)rand
GROUP BY artID // this is the only reasonable way i've got so far to avoid duplicates when an article has more than 1 photo
LIMIT x //它有所不同,有时我需要显示符合搜索查询的所有文章,有时我只需要几个(5或10)
重要提示:此查询有效。但我需要一种更有效的方法来做到这一点。子查询非常昂贵。
更新
简化表格结构:
Table art
artID: int
artName: varchar
artBrand: varchar
artPrice: decimal
provID: int
photo: int (when there is at least one available photo this is set to 1)
many more rows
Table prov
provID: int
provName: varchar
many more rows
Table photos
artID: int
thumb: varchar
normal: varchar
big: varchar
nothing fancy
答案 0 :(得分:2)
考虑到你已经制定的条件,我认为你有一个很好的解决方案。也就是说,我可以看到它将您的查询分成两部分的唯一其他选项。首先,获取项目,然后运行第二个查询以获取图片。然后最后在应用层,选择一张随机照片。
通过拆分查询,它们变得更简单,从而导致更易于维护的代码。它甚至可能更快,因为第一个查询将限制第二个查询甚至查看的照片数量 - 具体取决于您的索引方案。
答案 1 :(得分:1)
您是否考虑过在查询中返回所有照片并在应用层中随机挑选照片?如果每张物品只有几张照片,那么它可能并不像您想象的那么贵。值得一试。
答案 2 :(得分:0)
好的,既然你已经添加了更多的解释,让我改写我的答案。首先,您需要照片表的主键,遵循您的命名规则我将其命名为photoID
SELECT
*,
(SELECT photoID FROM photos
WHERE artID=art.artID
ORDER BY rand() LIMIT 1
) AS randPhoto, /*single random image of this item*/
(SELECT thumb FROM photos WHERE photoID=randPhoto) AS thumb,
(SELECT someotherfield FROM photos WHERE photoID=randPhoto) AS otherfield,
FROM art
LEFT JOIN prov USING ( provID )
WHERE artID >20
AND artID <40
不需要分组