mysql - WHERE in(子查询)子句 yii

标签 mysql yii yii2 yii2-advanced-app

我有一个像这样的 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 in 可以用 inner join

编写,也可以随意提出建议

这将使编写查询变得非常容易

谢谢

最佳答案

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();

关于mysql - WHERE in(子查询)子句 yii,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116278/

相关文章:

mysql - SQL 和 CASE 语句

mysql - 如何使用php将excel中的数据导出到mysql?

mysql - 如何使用 yii 框架在 SQL 查询中给出单引号?

yii - 在 OS X 上使用 Yiic 和 AMPPS

php - 根据属性数据获取具体模型实例 yii2

php - 是否可以对子查询创建的变量运行联接?

mysql - 如何在 Yii/Yii2 的同一个项目(应用程序)中连接 MongoDB 和 MySQL?

php - 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

yii2 - 如何让 Yii2 响应不同的 HTTP 响应?将在库中创建。

mysql - 如何解构 COUNT()?