2

所以,我在逻辑上的情况有点糟糕,我的数学也不是很好,所以我需要你的帮助“构建”一个查询来通过连接查询从 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'));
4

3 回答 3

2

试试这个查询,使用左连接,并在连接表上添加一个 WHERE 以使有效 id 为空,将返回连接右侧不存在的结果

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;
}
于 2012-06-10T20:32:11.880 回答
1

你没有正确地做ONJOIN你想要的uc.campaign_id = c.id不是!=

于 2012-06-10T20:31:23.670 回答
1

布莱恩!thanx 很多,最后我在你之前做的查询的帮助下设法做到了,我写的最后一个查询是这样的:

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

再次感谢你们!你太棒了!

于 2012-06-10T21:05:27.257 回答