2017-10-06 6 views
0

以下はその状況です。注文テーブルとメッセージテーブルを接続する必要があります。しかし、私は最初のメッセージ(最低のメッセージID)だけに興味があります。テーブル間の接続はオーダーIDです。SQL - GROUB BY - HAVING - MISSING ROWS

 $result = $this->db->executeS(' 
     SELECT o.*, c.iso_code AS currency, s.name AS shippingMethod, m.message AS note 
     FROM '._DB_PREFIX_.'orders o 
     LEFT JOIN '._DB_PREFIX_.'currency c ON c.id_currency = o.id_currency 
     LEFT JOIN '._DB_PREFIX_.'message m ON m.id_order = o.id_order 
     LEFT JOIN '._DB_PREFIX_.'carrier s ON s.id_carrier = o.id_carrier 
     LEFT JOIN jtl_connector_link l ON o.id_order = l.endpointId AND l.type = 4 
     WHERE l.hostId IS NULL AND o.date_add BETWEEN DATE_SUB(NOW(), INTERVAL 1 WEEK) AND NOW() 
     GROUP BY o.id_order 
     HAVING MIN(m.id_message) 
     LIMIT '.$limit 
    ); 

このクエリはこれまでのところ動作します。しかし、メッセージのない注文は見当たりません。

ありがとうございました! Markus

+0

あなたは –

+0

はありがとうそれを削除するので、より良いHAVING' 'のいずれかの比較を行っていません。私はHAVING min(m.id_message)が「最小のmessageidで行を返す」と誤解したと思います。 – mysecondworld

+0

GROUP BY句とHAVING句をスキップし、代わりに 'ORDER BY m.id_message LIMIT 1'を実行します。 – jarlh

答えて

0

複数の注文を選択し、最初のメッセージを注文したいとします。これは、ウィンドウ関数の欠如(例えば、ROW_NUMBER OVER)がMySQLでは一般的に困難です。しかし、あなたが興味を持っているメッセージテーブルの列は1つだけなので、SELECT句でサブクエリを使用できます。

SELECT 
    o.*, 
    c.iso_code AS currency, 
    s.name AS shippingMethod, 
    (
    SELECT m.message 
    FROM message m 
    WHERE m.id_order = o.id_order 
    ORDER BY m.id_message 
    LIMIT 1 
) AS note 
FROM orders o 
JOIN currency c ON c.id_currency = o.id_currency 
JOIN carrier s ON s.id_carrier = o.id_carrier 
WHERE o.date_add BETWEEN DATE_SUB(NOW(), INTERVAL 1 WEEK) AND NOW() 
AND NOT EXISTS 
(
    SELECT * 
    FROM jtl_connector_link l 
    WHERE l.endpointId = o.id_order 
    AND l.type = 4 
); 
+0

このソリューションをありがとうございます。多くを学んだ! <3 – mysecondworld