1

所以,我想出了这个查询,执行时效果很好。但是,由于我想使用 Zend 的分页,所以查询必须通过适配器。

这是必须转换的查询:(我已经删除了查询,所以只有重要的部分在这里。我知道你不能运行这个查询 LOL)

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

工作得很好!但是..如您所见,我使用的是“高级” WHERE IN case。不知何故,我无法得到这个转换,我被卡住了。

这是它必须转换为:

$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

编辑:将值直接插入到条件字符串中,只有在变量受信任的情况下才安全(或者如果您从用户那里获得它们,请确保在执行此操作之前将它们转换为浮点数)。

或者,您可以尝试避免子查询,而是进行连接,但这可能会影响性能(可能是好是坏)。

于 2012-05-14T01:42:32.373 回答
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 回答
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 回答