使用IN从结果集选择


SELECT From Result Set Using IN

我希望创建一个存储过程或一个像样的sql语句来从结果集查询。

因此,我在一个表中搜索与用户BOB 相关的房间编号

SELECT room_number FROM room_user WHERE user = BOB;

这会给我一些结果,如果我从PDO结果集中打印结果,我会看到

Array
(
   Array(
      [room_number] = 10
   )
   Array(
      [room_number] = 13
   )
)

我可以获取这些检索到的数据,将其分解为一个字符串,然后进行第二个查询:

SELECT title FROM rooms WHERE room_number IN('$roomString');

但是,我相信有一种更直接的方法,因为我已经在我的数据库中了。

有人知道一个方便的程序或声明来处理这个问题吗?

这只是一个JOIN。

SELECT rooms.title, rooms.room_number FROM rooms
JOIN room_user ON
    room_user.user = "BOB" AND
    room_user.room_number = rooms.room_number

一种方法是使用IN()子查询:

SELECT title FROM rooms WHERE room_number IN (
    SELECT room_number FROM room_user WHERE user = 'BOB'
);

另一个使用JOIN:

SELECT
  title
FROM 
  rooms JOIN room_user ON rooms.room_number = room_user.room_number
WHERE room_user.user = 'BOB';

对它们进行基准测试是肯定的,但我怀疑JOIN版本会更快一点。

查看您的选择

SELECT title FROM rooms WHERE room_number IN
(SELECT room_number FROM room_user WHERE user = BOB)

您可以将第一个查询用作子查询:

SELECT title FROM rooms WHERE room_number IN
(SELECT room_number FROM room_user WHERE user = "BOB");

但是这个解决方案的性能非常糟糕(使用PHP执行implode要快得多)。

另一位SO用户刚刚发布了一个使用JOIN的解决方案,它可能是最好的一个。

此时您可以使用这种方式的子查询

SELECT title FROM rooms WHERE room_number IN(
     SELECT room_number FROM room_user WHERE user = BOB
);

但是这个子查询可能需要比两个单独的查询更多的资源。