使用IN从结果集中选择

时间:2012-02-25 00:33:28

标签: php mysql pdo

我正在寻找一个存储过程或一个体面的sql语句来查询FROM结果集。

所以,我在一张表中搜索与用户BOB相关的room_numbers

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

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

任何人都知道有一个方便的程序或陈述来处理这个问题吗?

5 个答案:

答案 0 :(得分:1)

这只是一个加入。

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

答案 1 :(得分:0)

一种方法是使用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版本会更快一些。

答案 2 :(得分:0)

查看您的选择。

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

此时您可以使用子查询

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

但是这个子查询可能需要更多的资源来进行2次单独的查询。