任何MySQL大师都无处可去吗?组合后订单(替代子查询)

时间:2009-09-19 10:08:10

标签: sql mysql

我正在加入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)

重要提示:此查询有效。但我需要一种更有效的方法来做到这一点。子查询非常昂贵。

更新

  • 我每次都需要一张不同的照片
  • 我正在寻找最快的查询(这是我的问题)。
  • 产品的分类各不相同,有时我需要使用价格,有时候是名字,有时是随机的......
  • 有些文章没有照片,这就是我使用左连接的原因。我不能让他们出去。
  • 有些文章有10张,15张甚至20张照片。
  • 但在某些情况下,我需要显示与合影
  • WHERE最多可以有20个条件并且变得非常复杂。这只是一种简化。

简化表格结构:

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

3 个答案:

答案 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

不需要分组