所以,我在逻辑方面的情况有点糟糕,我的数学也不是那么好,所以我需要您的帮助"构建"一个查询,以通过连接查询从 3 个不同的表中获取信息。我的结构是这样的:
- 用户表:带主键"ID"
- 广告系列表:主键为"ID"
- User_Campaign表:user_id行和campaign_id行。
我想使用用户 ID X 拉取表中不存在user_campaign所有广告系列。
我的查询是针对Zend框架的。我会感谢任何形式的帮助,所以谢谢,来自以色列的晚上好!
我当前的查询:
$q = $this->select()
->setIntegrityCheck(false)
->from(array('c' => 'campaigns'))
->join(array('uc'=> 'user_campaign'), 'uc.campaign_id != c.id AND uc.user_id != 1', array('campaign_id', 'user_id'));
尝试此查询,使用左连接,并在连接表上添加 WHERE 以使有效 id 为 null,将返回连接右侧不存在的结果
public function check_access($campaign_id, $user_id) {
$q = $this->select()
->from(array('c' => 'campaigns'))
->joinRight(array('uc'=> 'user_campaign'), 'uc.campaign_id = c.id', array('campaign_id', 'user_id'));
->where('uc.user_id != ?', $user_id)
->where('campaign_id = ?', $campaign_id);
// User has an entry, return false
if($this->fetchRow($select))
return false;
// User wasn't found, create an entry, and return true
$this->insert('users_campaigns', array(
'user_id' => $user_id,
'campaign_id' => $campaign_id
));
return true;
}
您没有正确执行JOIN
ON
。您希望uc.campaign_id = c.id
不!=
布莱恩! 非常感谢,最后我设法从您之前所做的查询中获得了很多帮助,我写的最后一个查询是这样的:
$q = $this->select()
->setIntegrityCheck(false)
->from(array('c' => 'campaigns'))
->joinLeft(array('uc' => 'user_campaign'), "uc.campaign_id = c.id AND uc.user_id = '$id'")
->where('uc.campaign_id IS NULL');
再次感谢你们!你真棒!