2012-03-01 69 views
1

我有哪裏標籤和項目之間的引用都存儲在我的數據庫中的一個表,在表格獲取標籤多個唯一的隨機排在MySQL從一個參照表

 
id - tagID - itemID 
1 - 1 - 1 
2 - 2 - 1 
3 - 1 - 2 
4 - 3 - 2 
5 - 4 - 2 

我有作爲輸入當前的itemID,並且我想爲該項目的每個標籤選擇一個其他隨機項目ID。

最明顯的方法是運行一個查詢,選擇這一項的標籤,然後爲每個標籤的一個查詢選擇不同的itemid爲每個標籤。

例如,對於項目Id 「1」

SELECT tagID FROM mytags WHERE itemID=1 

然後的foreach標籤識別 「X」

SELECT itemID FROM mytags WHERE tagID= "X" AND itemID!=1 

但是,如果一個項目有10個標籤,這將導致只爲這11個查詢我的申請的一部分。

我試圖找到一種方式來運行單個SQL來得到相同的結果。

良好的開端是以下

SELECT tagID, itemID 
FROM `mytags` 
WHERE tagID IN (SELECT tagID 
       FROM `mytags` 
       WHERE itemID =1) 
AND itemID !=1 

但這返回所有其他行此項目的標籤,而我想只是其中之一。

任何人有任何偉大的想法?

感謝

+0

如果您只需要其中的一個,爲什麼不在查詢中添加「LIMIT 1」? – 2012-03-01 15:21:20

+0

因爲「限制1」會給我一個標籤中的一個項目。我希望每個標籤都有一個項目。 – user1092289 2012-03-02 15:57:57

回答

0

由於大部分八方通隨機挑選,也有相當多的爭論爲此在合併查詢:你將不得不ORDER BY RAND()這是一個性能殺手。我的建議是要麼工作在你周圍的語言,或創建一個stired過程:

  • 聲明遊標SELECT DISTINCT tagID FROM mytags WHERE itemID=1
  • 循環此光標做
  • SELECT MAX(id) INTO maxid FROM mytags WHERE tagID=current_tag_from_cursor AND itemID<>1
  • SELECT itemID FROM mytags WHERE tagID=current_tag_from_cursor AND itemID<>1 AND id>CAST(FLOOR(RAND()*maxid) AS UNSIGNED)

是的,你做了很多的查詢。 是的,如果在一個大於幾千行的表格上給出的表現仍然比ORDER BY RAND()更好

+0

ORDER BY RAND()我通過在php中工作避免了它(通過獲取第一個項目在X上,其中X我在PHP中計算)。我將研究如何/如果可以在我的環境中使用存儲過程。 – user1092289 2012-03-01 15:53:30