1

だから、私は実行時に完全にうまく動作するこのクエリを思いつきました。ただし、Zend のページネーションを使用したいので、クエリはアダプターを介して行う必要があります。

これは変換する必要があるクエリです: (クエリを切り取ったので、重要な部分のみがここにあります。このクエリを実行できないという事実は承知しています LOL)

//snip
WHERE
    city IN (
        SELECT 
            Plaatsnaam
        FROM
            plaatsnamen
        WHERE
            Latitude 
                BETWEEN 
                    ?
                AND 
                    ?
        AND
            Longitude
                BETWEEN
                    ?
                AND
                    ?       
    )
//snip

完全に正常に動作します!ただし..ご覧のとおり、「高度な」WHERE INケースを使用しています。どういうわけか、これを変換できず、行き詰まっています。

これは、次のように変換する必要があります。

$db = Zend_Db_Table::getDefaultAdapter();                
$select = $db->select('gethousecity.id, city')
                                ->from('gethousecity')
                                    ->join('houses_props', 'houses_props.id = gethousecity.id')
                                ->where('city IN ()') // HOW TO CONVERT THE UPPER QUERY TO FIT IT HERE?
                                ->where('is_online = 1')
                                ->where('houses_props.prop_name = ?', 'something')
                                ->where('houses_props.prop_value BETWEEN ? AND ?', array(1,2));

クエリをここに収まる形式に変換する方法に関するドキュメントはまったく見つかりませんでした。誰にもアイデアはありますか?主に、いくつかの値を挿入する必要があり、ZF がそこに奇妙なたわごとを書き直しているためです。

私は今ちょっと立ち往生しています、どんな助けも素晴らしいでしょう!

4

4 に答える 4

3

サブクエリは問題なく機能します。

$select1->cols('id')->where('date > NOW()');
$select2->where('id IN (?)', $select1);

問題が複雑な場合は、名前付きパラメーターを使用できます。

$select1 = $db->select();
$select2 = $db->select();
$select1->from('plaatsnamen', array('Plaatsnaam'))
        ->where('Latitude BETWEEN :latmin AND :latmax')
        ->where('Longitude BETWEEN :longmin AND :longmax');
$select2->from('gethousecity')
        ->join('houses_props', 'houses_props.id = gethousecity.id')
        ->where('city IN ?', $select1) // HOW TO CONVERT THE UPPER QUERY TO FIT IT HERE?
        ->where('is_online = 1')
        ->where('houses_props.prop_name = ?', 'something')
        ->where('houses_props.prop_value BETWEEN :propsmin AND :propsmax');
die($select2);

戻り値:

SELECT `gethousecity`.*, `houses_props`.*
FROM `gethousecity`
INNER JOIN `houses_props` ON houses_props.id = gethousecity.id
WHERE 
    (city IN (
        SELECT `plaatsnamen`.`Plaatsnaam`
        FROM `plaatsnamen`
        WHERE 
        (Latitude BETWEEN :latmin AND :latmax) AND
        (Longitude BETWEEN :longmin AND :longmax)
    )) AND
    (is_online = 1) AND
    (houses_props.prop_name = 'something') AND
    (houses_props.prop_value BETWEEN :propsmin AND :propsmax)

マニュアルに見られるように、名前付きパラメータで動作するはずです

$bind = array(
    ':latmin' => 10,
    ':latmax' => 3,
    '...' => '...',
);
$db->fetchAll($select2, $bind);
于 2012-05-14T14:51:43.717 に答える
0

私の知る限り、ZF DB はサブクエリをネイティブでサポートしていません。

あなたはこれを試みることができます:

// snip
->where("city IN (
    SELECT Plaatsnaam
    FROM plaatsnamen
    WHERE Latitude BETWEEN $lowLat AND $highLat
      AND Longitude BETWEEN $lowLon AND $highLon
)")
// snip

EDIT : 値を条件文字列に直接補間します。これは、変数が信頼できる場合にのみ安全です (または、ユーザーから変数を取得した場合は、これを行う前に浮動小数点数にキャストしてください)。

別の方法として、サブクエリを回避し、代わりに結合を実行することもできますが、これはパフォーマンスに影響を与える可能性があります (良くも悪くも)。

于 2012-05-14T01:42:32.373 に答える
0

これを試して

 $db = Zend_Db_Table::getDefaultAdapter();  
    $selectInner = $db->select()->from('plaatsnamen','Plaatsnaam')
                   ->where("Lattitude BETWEEN $lowLat AND $highLat")
                   ->where("Longitude BETWEEN $lowLon AND $highLon")
                   ->__toString();



    $select = $db->select('gethousecity.id, city')
                                    ->from('gethousecity')
                                        ->join('houses_props', 'houses_props.id = gethousecity.id')
                                    ->where("city IN ($selectInner)"); 
于 2012-05-14T11:11:23.817 に答える
0

最後に、簡単な回避策として、次のことを思いつきました。$db->引用.

$select = $db->select('gethousecity.id, city')
                                    ->from('gethousecity')
                                        ->join('houses_props', 'houses_props.id = gethousecity.id')
                                    ->where('city IN (  
                                                    SELECT Plaatsnaam
                                                    FROM plaatsnamen
                                                    WHERE Latitude BETWEEN '.$latlon_search[0].' AND '.$latlon_search[1].'
                                                        AND Longitude BETWEEN '.$latlon_search[2].' AND '.$latlon_search[3].'
                                    )') 
                                    ->where('is_online = 1')
                                    ->where('houses_props.prop_name = ?', 'vraagprijs[vraagprijs]')
                                    ->where('houses_props.prop_value BETWEEN '.$db->quote($price_start).' AND '.$db->quote($price_end));

私にとって、それがこの仕事をする唯一の方法でした。私がしたたびに:

->where('statement ? AND ?', array($val1, $val2)

結果は次のとおりです。

statement val1,val2 AND val1,val2
于 2012-05-14T01:58:18.080 に答える