2012-03-01 70 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