我希望创建一个存储过程或一个像样的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
);
但是这个子查询可能需要比两个单独的查询更多的资源。