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;

動作しますが、同じ tableに対して 2 つの異なる 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

結合を本当に使用したくない場合は、サブクエリでconcatCONCAT(b.name,";",b.email)を使用し、後で結果を爆発させることができます;が、私は結合に行きます:D

于 2013-08-20T17:08:10.580 に答える
0

Try this:

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 に答える