多个SELECT子查询将同一个表合并为一个

时间:2013-08-20 17:01:27

标签: mysql sql myisam

有一个表message和一个表sender,我想检索与特定ID相关的所有“消息信息”,以及发件人姓名和电子邮件。我有这个问题:

SELECT
    a.id,
    a.subject,
    a.body,
    a.sender_id,
    (
        SELECT b.name
        FROM sender b
        WHERE b.id = a.sender_id
        LIMIT 1
    ) AS sender_name,
    (
        SELECT b.email
        FROM sender b
        WHERE b.id = a.sender_id
        LIMIT 1
    ) AS sender_email,
    a.sent_time
FROM message a
WHERE a.id = <id>
LIMIT 1;

它可以工作,但它必须对同一个表执行两个不同的SELECT子查询。 在这种情况下(这是一个极其简化的例子)它可能根本不会损害性能,但在现实情况下,必须从外部表中检索很多字段,最好的方法是使用JOIN语句?是否有可能有一个SELECT子查询来检索许多字段?

我正在使用MySQLMyISAM存储引擎,以防万一。

3 个答案:

答案 0 :(得分:4)

只需在sender子句中加入FROM表。

SELECT  a.id,
        a.subject,
        a.body,
        a.sender_id,
        b.name,
        b.email,
        a.sent_time
FROM    message a
INNER JOIN
        sender b
ON      b.id = a.sender_id       
WHERE a.id = <id>
LIMIT 1;

答案 1 :(得分:0)

试试这个:

SELECT
    a.id,
    a.subject,
    a.body,
    a.sender_id,
    b.name AS sender_name,
    b.email AS sender_email,
    a.sent_time
FROM message a, sender b
WHERE a.id = <id>
AND b.id = a.sender_id
LIMIT 1;

答案 2 :(得分:0)

如果您真的不想使用加入,可以在子查询CONCAT(b.name,";",b.email)中使用concat,然后在;上展开结果 - 但我会去加入:d