2

ロジックの状況はちょっと悪く、数学はあまり得意ではないので、結合クエリで 3 つの異なるテーブルから情報を取得するクエリを「構築」するのに助けが必要です。私の構造は次のようなものです:

  • ユーザーテーブル:主キー「ID」付き
  • キャンペーン テーブル: 主キー「ID」を使用
  • User_Campaign テーブル : user_id 行と Campaign_id 行。

user_campaign テーブルに存在しない、ユーザー ID X のすべてのキャンペーンをプルしたいと考えています。

私のクエリは 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 を 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;
}
于 2012-06-10T20:32:11.880 に答える
1

ブライアン!どうもありがとう、最終的に私はあなたが以前に行ったクエリから多くの助けを借りてそれを行うことができました.そして私が書いた最終的なクエリはこれです:

$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 に答える
1

ONから をJOIN正しく実行していません。あなたはそうではありuc.campaign_id = c.idません!=

于 2012-06-10T20:31:23.670 に答える