【问题标题】:Select 2 Rows from Table when COUNT of another table当另一个表的 COUNT 时从表中选择 2 行
【发布时间】:2010-06-14 20:51:15
【问题描述】:

这是我目前拥有的代码:

   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_id 不在 value_1value_2B 中时,它当前应该做的是从 A 中选择 2 行。 B 中的行特定于 userid 的个人用户。

我还需要做的是检查B中是否已经有N行匹配A_idvalue_1value_2)和userid,如果行数多于 N 行,不会选择A 行。

【问题讨论】:

    标签: sql mysql count left-join


    【解决方案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
    

    【讨论】:

    • 谢谢托马斯!在大多数情况下,它正在工作。除了我有时会返回同一行两次(它不应该两次返回同一行),有时它会返回“B2.value_1 = A.A_id Or B2.value_2 = A.A_id”应该阻止它这样做的行。通常看起来它们的顺序不同。
    • @Marcus - 来自哪个查询?第一个查询不应该为 A 返回一个以上的 PK 值。如果您认为它多次返回同一行(什么的同一行?),您能否向我们展示一些示例输入和它产生的输出?
    • 哦,我明白了我做了什么......我误解了你,并结合了你的两个问题......哎呀。我现在可以工作了。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2012-03-22
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多