0

有一个 tablemessage和一个 table 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 子查询吗?

我正在使用带有MyISAM存储引擎的MySQL ,以防万一。

4

3 回答 3

4

Just join to the sender tables once in the FROM clause.

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;
于 2013-08-20T17:06:11.363 回答
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;
于 2013-08-20T17:06:25.833 回答
0

如果你真的不想使用连接,你可以在你的子查询中使用concatCONCAT(b.name,";",b.email)并稍后分解结果;- 但我会去连接:D

于 2013-08-20T17:08:10.580 回答