2009-09-19 66 views
1

我加入3個表。最後一個包含每個項目的幾張照片。這個想法是每個項目只獲得一個記錄,隨機選擇一張照片。 ORDER變化,WHERE變化。 我能得到的最好的是一個子查詢。 還有一個更有效的方法呢?任何MySQL大師在那裏?組後命令(替代subquerys)

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 

極限X1 //有異,有時我需要顯示符合搜索查詢的所有文章,有時我只需要幾個(5或10)

重要說明:此查詢WORKS。但我需要一個更有效的方式來做到這一點。子查詢非常昂貴。

更新:

  • 我需要一個不同的照片,每次
  • 我看着一個最快的查詢(這是我的問題點)。
  • 產品的分類有所不同,有時我需要使用價格,有時候這個名稱,有時是隨機的...
  • 有些文章沒有照片,這就是爲什麼我使用左連接。我不能讓他們出去。
  • 有些文章有10,15甚至20張照片。
  • 但在某些場合,我需要證明 articled 照片
  • 的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 
+0

你能否也顯示你的表格結構? – Zed 2009-09-19 10:14:38

+0

當你說「隨意」時,你是否希望它每次都有所不同,或者你是否不在乎它是什麼,即使它每次都是一樣的? – 2009-09-19 10:32:17

+0

@Josh:我需要每次都會有所不同。 – 2009-09-20 03:11:14

回答

2

鑑於你已經佈置的條件,我認爲你有一個很好的解決方案。也就是說,我可以看到它將您的查詢分成兩部分的唯一選項。首先,獲取該項目,然後運行第二個查詢來獲取圖片。然後最後在應用程序層選擇一張隨機照片。

通過分解你的查詢,他們都變得更簡單,這導致更易於維護的代碼。它甚至可能會更快,因爲第一個查詢將限制第二個查詢甚至要查看的照片數量 - 具體取決於您的索引方案。

+0

是的,我正在測試這個分兩步似乎是一個更好的解決方案(和memcached使用它更好)。如果沒有人出現一個更好的主意,賞金是你的。 – 2009-09-30 03:11:13

0

OK,既然你已經加入了更多的解釋,讓我重寫我的答案。首先你需要的照片表的主鍵,下面的命名規則,我將其命名爲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 

通過無需組

+0

但它缺少獲取隨機圖像的部分 – 2009-09-20 03:24:40

+0

好吧,既然你已經添加了更多的解釋,我已經重寫了我的答案,請再次檢查。 – 2009-09-20 05:41:34

+0

rand()的使用肯定有效嗎?我知道它不在[MSSQL服務器]中,每個記錄獲得相同的值,Rand()被執行一次然後被替換,而不是每個記錄一次。我相信我已經看到關於「隨機選擇一個記錄」的問題,它說它對MySQL也有效......(但我不是MySQL專家,所以我想我會問) – MatBailie 2009-09-20 09:54:49

1

你有沒有考慮返回所有的照片在您的查詢,並隨機挑選照片在你的應用層?如果每個物體只有幾張照片,則可能不像您想象的那麼昂貴。這可能值得一試。

+0

某些項目最多可以顯示20張照片。我需要做的事情,如「顯示5最暢銷的文章」,所以我必須使用LIMIT子句,否則我會得到數據庫中的所有文章乘以照片 – 2009-09-26 17:58:03