如何使用Zend选择NOT IN并消除匹配的行

时间:2013-10-10 16:23:52

标签: mysql zend-framework

这是我想要做的。我有一张桌子里面有奖牌。有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,它匹配我试图从我的选择中消除的行。换句话说,我正在尝试消除user_idNOT IN数组中的任何内容匹配的行。 (选择中会有一系列奖牌。)这就是我的想法:

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

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

1 个答案:

答案 0 :(得分:0)

的子选择
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 Object表示法中,这将转换为

$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();

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