2016-09-06 7 views
2

私はこれらの2つのSQLを結合したいと思っており、1つは別のものの結果に基づいています。私はthis postをチェックしましたが、その結果に基づいていないようです。どうすれば達成できますか?これら2つのSQL文をどのように組み合わせて1つにすることができますか?

まずSQL:

SELECT 
    `potential`.*, 
    `customer`.`ID` as 'FID_customer' 
FROM 
    `os_potential` as `potential`, 
    `os_customer` as `customer` 
WHERE `potential`.`FID_author` = :randomID 
     AND `potential`.`converted` = 1 
     AND `potential`.`street` = `customer`.`street` 
     AND `potential`.`zip` = `customer`.`zip` 
     AND `potential`.`city` = `customer`.`city`; 

2番目のSQL:

SELECT 
    sum(`order`.`price_customer`) as 'Summe' 
FROM 
    `os_order` as `order`, 
    `RESUTS_FROM_PREVIOUS_SQL_STATEMENT` as `results` 
WHERE `order`.`FID_status` = 10 
     AND `results`.`FID_customer` = `order`.`FID_customer`; 

私は最初のSQL + 2番目のSQLから 'Summe' からすべてを取得したいと思います。

TABLES

1.Potentials:

+----+------------+-----------+--------+-----+------+ 
| ID | FID_author | converted | street | zip | city | 
+----+------------+-----------+--------+-----+------+ 

2.Customers:

+----+--------+-----+------+ 
| ID | street | zip | city | 
+----+--------+-----+------+ 

3.Orders:

+----+--------------+----------------+ 
| ID | FID_customer | price_customer | 
+----+--------------+----------------+ 
+3

DBと関係の構造を知らなくても、あなたの質問に答えにくいですテーブル間。あなたはそれに光を当てることができますか? –

+1

サブクエリが必要なようです。テーブルのように、それらをテーブルとして必要とするクエリのサブクエリとして動作させるために必要となる*別のクエリの*結果を使用します。 –

+0

@AndyKorneyev私の投稿を編集し、私の質問の下にテーブルを表示しました。 – ksno

答えて

3
SELECT p.* 
    , c.ID FID_customer 
    , o.summe 
    FROM os_potential p 
    JOIN os_customer c 
    ON c.street = p.street 
    AND c.zip = p.zip 
    AND c.city = p.city 
    JOIN 
    (SELECT FID_customer 
      , SUM(price_customer) Summe 
     FROM os_order 
     WHERE FID_status = 10 
     GROUP 
      BY FID_customer 
    ) o 
    ON o.FID_customer = c.ID 
WHERE p.FID_author = :randomID 
    AND p.converted = 1 
    ; 
+0

ありがとうございました。それは私が必要とするものを正確に行います。どのように動作するのか少し説明していただけますか? – ksno

+0

私は第2のクエリをとり、それを最初のクエリの内側に貼り付けました。これは、無相関サブクエリと呼ばれます。 – Strawberry

0

I番目インクを使用する場合は副選択を使用する必要がありますが、結果の数に注意する必要がありますが、パフォーマンスには最適ではありません。

あなたはこのような何か行うことができます:副選択は、ただ1の結果を返さなければならないこと

SELECT n1, n2, (select count(1) from whatever_table) as n3, n4 from whatever_table 

ノートを、他のケースでは、あなたはちょうどこのような単一のクエリを記述し、エラー

2

を持っています:

SELECT sum(o.price_customer) as Summe 
FROM os_order o JOIN 
    os_potential p JOIN 
    os_customer c 
    ON p.street = c.street AND p.zip = c.zip AND p.city = c.city JOIN 
    os_order o2 
    ON o2.FID_customer = c.FID_customer 
WHERE p.FID_author = :randomID AND p.converted = 1 AND 
     o2.FID_status = 10 ; 

注:

  • FROM句にカンマを使用してください。 常にON句の条件付き明示的なJOIN構文を使用してください。
  • テーブルのエイリアスは、短い場合に従うのが簡単です。テーブル名の略語が一般的に使用されます。
  • バッククォートは、テーブル/カラム名をエスケープする必要がある場合にのみ必要です。あなたはエスケープする必要はありません。
+0

'order'は予約語です(order by)。これは元のクエリのバッククォートで囲まなければなりません – Shadow

+0

@Shadow' order'はテーブル/カラム名にとっては貧弱な選択ですが、バックティックは必要ありませんこの特定の状況では、それはOPが探しているものだと私は確信していません。 – Strawberry

+0

最後にJOINにTYPOがあります。os.orderはos_orderでなければなりません。私はそれを修正すると 'not unique table/alias:' o''ll、uknownカラム 'c.FID_customer'がc.IDでなければなりません。私はそれらすべてを修正するとき。私は巨大な数で1列と1列を取得します。私は本当に初心者なので、どこから来たのか知りません。しかし、ノートにはとても感謝しています。私はジョイントと良いSQLの習慣を喜んで学ぶ! – ksno

1

顧客ごとの第一クエリの復帰1レコードは、その後、単に、3つのテーブルを結合するの和を維持し、group by句を使用する場合:第一クエリは、複数の返す可能性がある場合

SELECT 
    `potential`.*, 
    `customer`.`ID` as 'FID_customer', 
    sum(`order`.`price_customer`) as Summe 
FROM 
    `os_potential` as `potential` 
INNER JOIN 
    `os_customer` as `customer` 
ON `potential`.`street` = `customer`.`street` 
     AND `potential`.`zip` = `customer`.`zip` 
     AND `potential`.`city` = `customer`.`city` 
LEFT JOIN 
    `os_order` as `order` 
ON `results`.`FID_customer` = `order`.`FID_customer` 
     AND `order`.`FID_status` = 10 
WHERE `potential`.`FID_author` = :randomID 
     AND `potential`.`converted` = 1 
GROUP BY `customer`.`ID`, <list all fields from potential table> 

をお客様一人あたりのレコード数は、サブクエリで集計する必要があります。

SELECT 
    `potential`.*, 
    `customer`.`ID` as 'FID_customer', 
    `order`.Summe 
FROM 
    `os_potential` as `potential` 
INNER JOIN 
    `os_customer` as `customer` 
ON `potential`.`street` = `customer`.`street` 
     AND `potential`.`zip` = `customer`.`zip` 
     AND `potential`.`city` = `customer`.`city` 
LEFT JOIN 
    (SELECT FID_customer, sum(price_customer) as Summe 
    FROM `os_order` 
    WHERE FID_status=10 
    GROUP BY FID_customer 
    ) as `order` 
ON `results`.`FID_customer` = `order`.`FID_customer` 
WHERE `potential`.`FID_author` = :randomID 
     AND `potential`.`converted` = 1 
関連する問題