2015-10-14 41 views
4

我有一个mysql这样的查询凡(子查询)子句警予

(SELECT 
    `notification`.`id`, `notification`.`user_id` AS `user_id`, `notification`.`activity_type`, `notification`.`source_id`, `event`.`title` as sourceName,concat_ws(" ",v.firstname,v.lastname) as ActorName 
FROM 
    `notification` 
INNER JOIN 
    `event` 
ON 
    event.id = notification.source_id 
INNER JOIN 
    `user` as v 
ON 
     v.id = notification.user_id 
AND 
     notification.activity_type = "checkin" 
where 
     user_id in 
     (SELECT friend.friend_id from friend WHERE friend.user_id=1 AND friend.is_active=1)) 
UNION 
(SELECT 
     `notification`.`id`, `notification`.`user_id` AS `user_id`, `notification`.`activity_type`, `notification`.`source_id`, concat_ws(" ",u.firstname,u.lastname) as sourceName,concat_ws(" ",v.firstname,v.lastname) as ActorName 
FROM 
     `notification` 
INNER JOIN 
     `user` as u 
ON 
     u.id = notification.source_id 
INNER JOIN 
     `user` as v ON v.id = notification.user_id 
AND 
     notification.activity_type = "friend" 
where user_id in 
     (SELECT friend.friend_id from friend WHERE friend.user_id=1 AND friend.is_active=1)) 

,我希望写yii2该查询,我不知道如何写条子查询中where

到目前为止,我已经做到了这一点

$query2 ->select(['notification.id', 'notification.user_id AS user_id', 'notification.activity_type', 'notification.source_id', 'concat_ws(" ",u.firstname,u.lastname) as sourceName','concat_ws(" ",v.firstname,v.lastname) as ActorName','user_image.imagepath as image']) 
      ->from('notification') 
      ->innerJoin('user as u', 'u.id = notification.source_id') 
      ->innerJoin('user_image','user_image.user_id = notification.user_id') 
      ->innerJoin('user as v', 'v.id = notification.user_id AND notification.activity_type = "friend"') 
      ->where('user_image.imagetype="profile"') 
      ->andWhere(['user_id'=>('SELECT friend.friend_id from friend WHERE friend.user_id='.$id.' AND friend.is_active=1')]); 

$query ->select(['notification.id','notification.user_id AS user_id','notification.activity_type', 'notification.source_id', 'event.title as sourceName','concat_ws(" ",v.firstname,v.lastname) as ActorName','organiser.image as image']) 
      ->from('notification') 
      ->innerJoin('event', 'event.id = notification.source_id') 
      ->innerJoin('organiser','organiser.organiser_id = event.organiser_id') 
      ->innerJoin('user as v', 'v.id = notification.user_id AND notification.activity_type = "checkin"') 
      ->Where(['in', 'user_id', [488,489]]) 
      ->union($query2); 

生成命令这样的查询

(SELECT 
    `notification`.`id`, `notification`.`user_id` AS `user_id`, `notification`.`activity_type`, `notification`.`source_id`, `event`.`title` AS `sourceName`, concat_ws(" ",v.firstname,v.lastname) as ActorName, `organiser`.`image` AS `image` 
FROM 
    `notification` 
INNER JOIN 
    `event` 
ON 
    event.id = notification.source_id 
INNER JOIN 
    `organiser` 
ON 
    organiser.organiser_id = event.organiser_id 
INNER JOIN 
    `user` `v` 
ON 
    v.id = notification.user_id 
AND 
     notification.activity_type = "checkin" 
WHERE 
    `user_id` IN (:qp0, :qp1)) 
UNION 
(SELECT 
    `notification`.`id`, `notification`.`user_id` AS `user_id`, `notification`.`activity_type`, `notification`.`source_id`, concat_ws(" ",u.firstname,u.lastname) as sourceName, concat_ws(" ",v.firstname,v.lastname) as ActorName, `user_image`.`imagepath` AS `image` 
FROM 
    `notification` 
INNER JOIN 
    `user` `u` 
ON 
     u.id = notification.source_id 
INNER JOIN 
     `user_image` 
ON 
     user_image.user_id = notification.user_id 
INNER JOIN 
     `user` `v` 
ON 
     v.id = notification.user_id 
AND 
     notification.activity_type = "friend" 
WHERE 
     (user_image.imagetype="profile") AND (`user_id`=:qp2)) 

但其没有工作,所以什么是正确的语法 也随时给建议如果where中可以写inner join

这样会很容易写出查询

谢谢

+0

ü得到什么误差R? – Bloodhound

回答

1
Try This 




$query = (new Query()) 
      ->select('notification`.`id`, `notification`.`user_id` AS `user_id`, `notification`.`activity_type`, `notification`.`source_id`, `event`.`title` as sourceName,concat_ws(" ",v.firstname,v.lastname) as ActorName') 
      ->from('notification') 
      ->innerJoin('event' ,'event.id = notification.source_id') 
      ->innerJoin('user v' ,'v.id = notification.user_id') 
      ->where([ 
       'user_id' => (new Query()) 
        ->select('friend.friend_id') 
        ->from('friend') 
        ->where([ 
         'friend.user_id' => 1, 
         'friend.is_active' => 1 
        ]) 
      ])->andWhere([ 
       'notification.activity_type' => "checkin" 
      ]); 

     $query2 = (new Query()) 
      ->select('`notification`.`id`, `notification`.`user_id` AS `user_id`, `notification`.`activity_type`, `notification`.`source_id`, concat_ws(" ",u.firstname,u.lastname) as sourceName,concat_ws(" ",v.firstname,v.lastname) as ActorName') 
      ->from('notification') 
      ->innerJoin('user v' ,'v.id = notification.user_id') 
      ->where([ 
       'user_id' => (new Query()) 
        ->select('friend.friend_id') 
        ->from('friend') 
        ->where([ 
         'friend.user_id' => 1, 
         'friend.is_active' => 1 
        ]) 
      ])->andWhere([ 
       'notification.activity_type' => "checkin" 
      ])->union($query)->all(); 
+0

我也想在查询结尾添加'limit'和'offset' ..我的意思是我想为这两个查询的总结果集设置限制..我怎么做? –

0

您可以使用Yii2 Query Builder,这里是一个例子。

$subQuery = (new \yii\db\Query())->select([ 
        'users.id as userId', 
        'users.first_name', 
        'users.username', 
        'users.last_name', 
        'users.sector_id', 
       ]) 
       ->from(['users']) 
       ->where(['=', 'role_id', 3]) 
       ->orWhere(['=', 'role_id', 2]) 
       ->groupBy('users.id'); 

$query = (new \yii\db\Query())->select(['user.*', 'user_address.*']) 
      ->from(['user'=>$subQuery]) 
      ->leftJoin('user_address', 'user.userId = user_address.user_id') 
      ->where(['between', 'latitude', $min_lat, $max_lat]) 
      ->andWhere(['between', 'longitude', $min_lon, $max_lon]) 
      ->groupBy('user.userId');