2016-07-30 18:28:05 13258次浏览 1条回答 1 悬赏 50 金钱

我想查询一个表的数据,优先查询地区是本地的

$find=$this->find()->where(['>','p_partytime',date('Y-m-d H:i:s',time())])->andWhere(['p_area'=>$area])->orderBy('p_partytime asc');
$not=$this->find()->where(['>','p_partytime',date('Y-m-d H:i:s',time())])->andWhere(['<>','p_area',$area])->orderBy('p_partytime asc');
return $find->union($not)->offset($offset)->limit(10)->asArray()->all();

但执行的sql语句是这样的

(SELECT * FROM `pet_party` WHERE (`p_partytime` > '2016-07-30 18:24:15') AND (`p_area`='2') ORDER BY `p_partytime` LIMIT 10 OFFSET 10) UNION ( SELECT * FROM `pet_party` WHERE (`p_partytime` > '2016-07-30 18:24:15') AND (`p_area` <> '2') ORDER BY `p_partytime` )

而我想要执行的sql语句是这样的

(SELECT * FROM `pet_party` WHERE (`p_partytime` > '2016-07-30 18:24:15') AND (`p_area`='2') ORDER BY `p_partytime`) UNION ( SELECT * FROM `pet_party` WHERE (`p_partytime` > '2016-07-30 18:24:15') AND (`p_area` <> '2') ORDER BY `p_partytime` ) LIMIT 10 OFFSET 10

前面先限制了条数在第一条语句里,而我想两条都查完之后在limit限制条数
请问怎么在我model查询的代码基础上更改?
麻烦各位大神帮忙!

最佳答案

  • javalzbin 发布于 2016-07-31 18:13 举报

    我个人认为吧,如果语句复杂,不如直接写sql。
    你这个可以这么改

    return $find->union($not)->offset($offset)->limit(10)->asArray()->all();
    

    改成:

    return (new Query())->from(['tmpA' => $find->union($not)])->offset($offset)->limit(10)->all();
    

    最后生成的语句类似如此:

    SELECT * FROM (
    (SELECT * FROM `pet_party` WHERE (`p_partytime` > '2016-07-30 18:24:15') AND (`p_area`='2') ORDER BY `p_partytime`) 
    UNION 
    ( SELECT * FROM `pet_party` WHERE (`p_partytime` > '2016-07-30 18:24:15') AND (`p_area` <> '2') ORDER BY `p_partytime` )
    ) 
    `tmpA` LIMIT 5 OFFSET 0
    
    2 条回复
    回复于 2016-08-01 09:02 回复

    恩,谢谢,今天改了试了下 真的是我想要的数据,再次拜谢~

    回复于 2016-08-15 13:16 回复
    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
lzrqyc110
总监

lzrqyc110

注册时间:2016-01-02
最后登录:2018-12-28
在线时长:29小时34分
  • 粉丝37
  • 金钱4195
  • 威望40
  • 积分4885

热门问题