0

SQL クエリを作成しようとしていますが、いくつか問題があります。

CREATE table entries (
id_entry INT PRIMARY KEY,  
);

CREATE table entry_date (
  entry_date_id INT PRIMARY KEY,
  entry_id INT,
  entry_price INT,
  entry_date TEXT,
);

各エントリには、いくつかの日付があります。

たとえば、そのエントリに日付「23/03/2013」と「24/03/2013」がリンクされているentries.entry_idを選択したいと思います。

2 つの日付が配列に格納されます。

 $data = array('ci' => '23/03/2013', 'co' => '24/03/2013');

治療の実用的な目的のために、日付をテキストで保存します。Zend_Db を使用しているため、クエリは次のように作成されます。

$select = $table->select ()->from ( 'entries' )->setIntegrityCheck ( false );

        if ($data ['ci'] != NULL) {
            $select->join ( array (
                    'entry_dates' => 'entry_dates' 
            ), 'entries.id_entry = entry_dates.entry_id' );
            $select->where ( 'entry_dates.entry_date = ?', $data ['ci'] );
        }
        if ($data ['co']) {
            if ($data['ci'] == NULL) {
            $select->join ( array (
                    'entry_dates' => 'entry_dates' 
            ), 'entries.id_entry = entry_dates.entry_id' );}
            $select->where ( 'entry_dates.entry_date = ?', $data ['co'] );  
        }

を与える:

SELECT `entries`.*, `entry_date`.* 
FROM `entries` 
INNER JOIN `entry_dates` 
ON entries.id_entry = entry_dates.entry_id 
WHERE (entry_dates.entry_date = '23/03/2013') 
AND (entry_dates.entry_date = '24/03/2013')

そして、まあ...うまくいきません。$select をフェッチしても、何も得られません。

WHERE ... を実行したときにリクエストに何かが欠けていると思いますが、正しい出力を得るにはどうすればよいですか? 実際のリクエストは非常に長いため、可能であれば別の長いサブセレクトを避けたいと思います。

4

1 に答える 1

1

entry_date テーブルでの自己結合のいずれかを使用して、次の 2 つの方法で実行できます。

SELECT `entries`.entry_id
FROM `entries` 
INNER JOIN `entry_dates` AS ed1
ON entries.id_entry = ed1.entry_id 
INNER JOIN `entry_dates` AS ed2
ON entries.id_entry = ed2.entry_id 
WHERE ed1.entry_date = '23/03/2013'
AND ed2.entry_date = '24/03/2013'

または集計で

SELECT `entries`.entry_id
FROM `entries` 
INNER JOIN `entry_dates` AS ed
WHERE ed.entry_date = '23/03/2013'
OR ed2.entry_date = '24/03/2013'
GROUP BY `entries`.entry_id
HAVING COUNT(DISTINCT ed.entry_date)=2
于 2013-03-23T19:09:29.627 に答える