这是我想要做的。我有一张桌子里面有奖牌。有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_id
与NOT IN
数组中的任何内容匹配的行。 (选择中会有一系列奖牌。)这就是我的想法:
$db->select()->from('medals')
->where('medal_id NOT IN (?)', $medalIdsArray)
->where('user_id NOT IN (?)', _________);
但我不知道该把什么留给空白。我想知道我是否需要某种子选择。我只是不知道从哪里开始?有人可以帮忙吗?感谢。
答案 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();
这将打印出上面显示的查询。