2010-06-14 98 views
0

这里COUNT是我目前拥有的代码:从表中选择2个行时另一个表

SELECT `A`.* 
    FROM `A` 
LEFT JOIN `B` ON `A`.`A_id` = `B`.`value_1` 
    WHERE `B`.`value_2` IS NULL 
     AND `B`.`userid` IS NULL 
ORDER BY RAND() LIMIT 2 

什么它目前应该做的是选择2行从A当所选择的两行A_id是不在value_1value_2B。并且B中的行特定于具有userid的个人用户。

我需要做的就是让它也让还检查是否已经有N行中B一个A_id(在value_1,或value_2)和userid匹配,如果有N多行多,这不是不要选择A行。

回答

1

下将处理您的第一个请求:把戏的

Select ... 
From A 
    Left Join B 
     On (B.value_1 = A.A_id Or B.value_2 = A.A_id) 
      And B.userid = @userid 
Where B.<non-nullable column> Is Null 

部分正在您的标准到左连接的ON子句。我不确定您的请求的第二部分如何适合第一部分。如果B中没有与给定用户的value_1或value_2匹配的行,则根据定义,行计数将为零。是否你希望它是在给定的条件下只能有最大数量的B行匹配的情况?如果是这样,那么我会写我的问题,如下所示:

Select ... 
From A 
Where (
     Select Count(*) 
     From B B2 
     Where (B2.value_1 = A.A_id Or B2.value_2 = A.A_id) 
      And B2.userid = @userid 
     ) <= @MaxItems 
+0

谢谢Thomas! 它的工作,大部分。除了我有时在同一行返回两次(它不应该有相同的行返回两次),有时它返回行“B2.value_1 = A.A_id或B2.value_2 = A.A_id'”应该阻止它这样做。通常情况下,他们似乎在不同的顺序。 – Marcus 2010-06-15 05:26:22

+0

@Marcus - 从哪个查询?第一个查询不应该为A返回多个PK值。如果您认为它多次返回同一行(同一行?),您能向我们展示一些示例输入和它正在生成的输出吗? – Thomas 2010-06-15 14:45:23

+0

哦,我明白我的所作所为......我误解了你,并将你的疑问和你的疑问结合起来......哎呀。我现在已经开始工作了。再次感谢! – Marcus 2010-06-15 21:04:14

相关问题