【问题标题】:How to SELECT NOT IN with Zend and eliminate matching rows如何使用 Zend 选择 NOT IN 并消除匹配的行
【发布时间】:2013-10-10 16:23:51
【问题描述】:

这就是我想要做的。我有一张桌子,上面有奖牌。有一个user_id 列和一个medal_id 列。拥有相同user_id 的人拥有多个奖牌,所以我的数据如下所示:

user_id | medal_id
101       1
123       2
101       2
144       1
144       2
....

我需要(使用 Zend)选择所有奖牌,例如,medal_id 为 2。使用 SELECT ... NOT IN 将从我的选择中删除第 2,3 和 5 行。但我还需要消除其他两行,因为它们有一个user_id,它与我试图从我的选择中消除的行相匹配。换句话说,我正在尝试使用与我的NOT IN 数组中的任何内容匹配的user_id 来消除行。 (在评选中会有一系列奖牌。)这是我的想法:

$db->select()->from('medals')
   ->where('medal_id NOT IN (?)', $medalIdsArray)
   ->where('user_id NOT IN (?)', _________);

但我不知道该填什么。我想知道是否需要某种子选择。我只是不知道从哪里开始?有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: mysql zend-framework


    【解决方案1】:

    一个子选择

    SELECT DISTINCT user_id FROM medals WHERE medal_id =2
    

    列出所有拥有您要排除的奖牌的用户。然后你可以选择所有剩余的行:

    SELECT user_id, medal_id FROM medals WHERE user_id NOT IN (SELECT DISTINCT user_id FROM medals WHERE medal_id =2)
    

    要将其放入 Zend 对象表示法,这将转换为

    $sub_select = $zdb->select()
                  ->from("medals", array("distinct user_id"))
                  ->where("medal_id = ?", '2');
    $select = $zdb->select()
              ->from("medals", array("user_id", "medal_id"))
              ->where("user_id NOT IN ?", $sub_select);
    print $select->__toString();
    

    这将打印出上面显示的查询。

    【讨论】:

    • 我不得不稍微修改一下您的语法,但它似乎可以正常工作。非常感谢@elie。
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2021-05-18
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多