2012-05-08 8 views
3

LEFT JOINクエリを使用して1対多の関係を持つ2つのテーブルからいくつかの結果を取得しようとしていますが、 「子供たち」の数。私は2つのテーブルは次のように構成されている:SQL LEFT JOINクエリの結果セットをカウントで制限する方法

customers 
id name ... 
1  "bob" ... 
2  "jill" ... 

orders 
id customer_id ... 
100 1    ... 
101 2    ... 
102 1    ... 

(テーブル内のデータの残りの部分は、このクエリには無関係です。)

は、私は何をしたいのですが、すべての顧客IDとその順序IDを取得しています顧客によってソートされ、が含まれますが、注文を複数注文した顧客に限ります。この例では、結果は次のようになります。私は基本的なLEFTを開始しました

cust_id order_id 
1   100 
1   102 

顧客と注文IDをペアに参加するが、すべてのお客様にその避難所を除外する方法を見つけ出すことはできません」少なくとも2回注文する。

SELECT 
    `customers`.`id` AS `cust_id`, 
    `orders`.`id` AS `order_id` 
FROM 
    `customers` 
LEFT JOIN `orders` ON 
    `customers`.`id` = `orders`.`customer_id` 
ORDER BY 
    `cust_id` 

ありがとうございます。

答えて

7

複数の注文と内部結合を持つ顧客を取得するインラインビューを作成する方法の1つです。また、にをするか、またはあなたが登録しよう

SELECT 
    `customers`.`id` AS `cust_id`, 
    `orders`.`id` AS `order_id` 
FROM 
    `customers` 
LEFT JOIN `orders` ON 
    `customers`.`id` = `orders`.`customer_id` 
INNER JOIN 
     (SELECT `customer_id `  
     FROM `orders` 
     GROUP BY `customer_id`  
     HAVING COUNT(id) > 1) as `morethanone` 
On 
    `customer`.`id` = `morethanone`.`custmor_id` 
ORDER BY 
    `cust_id` 
+0

私がそれらを言う前に私の答えを取る! –

+0

ありがとう!これは、私が探していた結果セットを与えているようです。 –

+0

私は助けてもらえましたが、Marlin Pierceは、LEFT JOINは何もしていません。 –

1

ファーストが好きではない場合に、内側を含むことになる参加の唯一の違いので、あなたは、外残したい参加必要はありませんでしたEXISTS受注のないお客様は、2つ以下の注文があるため、結果にそれらの商品が不要になります。

SELECT customers.id AS `cust_id`, orders.id AS `order_id` 
FROM customers 
    INNER JOIN orders ON `customers`.`id` = `orders`.`customer_id` 
    INNER JOIN orders count_orders ON customers.id = count_orders.customer_id 
GROUP BY count_orders.id, orders.id 
HAVING count(count_orders.id) >= 2 
ORDER BY `cust_id` 
+0

これは近いです... [コンラッドフリックスの答え](http:// stackoverflow。com/a/10507232/1304626)が正しい結果セットを返すように見え、あなたの行数は同じです。ただし、各顧客IDの下にある注文IDは複製されます。例えば、 "1,100; 1,102"の代わりに "1,100; 1,100"(私の質問で例を拡張する)を与えます。 –

+1

答えは修正で編集されました。 SQLは実際に試して調整を行うので、それはカフのSQLの解答に問題があります。 –

+0

+1興味深い解決策。私は決してあなたが数えて同じ分野でグループ化することを可能にする[デカルト四角](http://sqlfiddle.com/#!2/5ba19/3)を作成することによって誰もこの問題を解決するのを見たことがない –

0

注文していない顧客を除外する場合は、LEFT JOINは不要ですか?

結果セットに注文IDが必要なので、最初にCOUNTクエリを実行する必要があります。 SQL Serverの、2005+では

、CTEはカウントクエリのトリックを行います、そして、あなたが望む結果セットは、そのカウントクエリに基づいて製造することができる。

WITH customerWithMoreThanOneOrder AS 
(
    SELECT 
     `customers`.`id` AS `cust_id` 
    FROM 
     `customers` 
    INNER JOIN `orders` ON 
     `customers`.`id` = `orders`.`customer_id` 
    GROUP BY 
     `customers`.`id` 
    HAVING COUNT(0) > 1 
) 

SELECT 
    `customers`.`id` AS `cust_id`, 
    `orders`.`id` AS `order_id` 
FROM 
    `customers` 
INNER JOIN `orders` ON 
    `customers`.`id` = `orders`.`customer_id` 
WHERE `customers`.`id` IN (SELECT cust_id FROM customerWithMoreThanOneOrder) 
ORDER BY 
    `cust_id` 

データベースであれば、あなたは」この構造をサポートしていない使用して再、単にそのようなのINサブクエリのための括弧内にカウントクエリを置く:

SELECT 
    `customers`.`id` AS `cust_id`, 
    `orders`.`id` AS `order_id` 
FROM 
    `customers` 
INNER JOIN `orders` ON 
    `customers`.`id` = `orders`.`customer_id` 
WHERE `customers`.`id` IN (SELECT 
           `customers`.`id` AS `cust_id` 
          FROM 
           `customers` 
          INNER JOIN `orders` ON 
           `customers`.`id` = `orders`.`customer_id` 
          GROUP BY 
           `customers`.`id` 
          HAVING COUNT(0) > 1) 
ORDER BY 
    `cust_id` 

は、ご質問があれば、私に教えてください

+0

これはMySQL用です。提案はうまくいくでしょう。しかし、2番目の提案はmysqldプロセスを無限ループに送り出しているようです。クエリは私にとって論理的だと思われるので、MySQL自体の問題かもしれません。彼らのリリースは最近、バグとバグが増えています... –

1

Heh、少し遅いと思うけど、とにかく私の答えを投稿するよ。それはやや異なりますが、まだ動作します。

SELECT `customers`.`id` AS `cust_id` , count(orders.id) AS count_orders 
FROM `customers` 
JOIN `orders` ON `customers`.`id` = `orders`.`customer_id` 
GROUP BY customers.id 
HAVING count(orders.id) >1 
ORDER BY `cust_id` 
0

他の回答の代わりに、IN句を使用できます。

SELECT 
    `customers`.`id` AS `cust_id`, 
    `orders`.`id` AS `order_id` 
FROM 
    `customers` 
LEFT JOIN `orders` ON 
    `customers`.`id` = `orders`.`customer_id` 
WHERE `customer_id` IN (SELECT `customer_id` FROM `orders` GROUP BY `customer_id` HAVING COUNT(*) > 1) 
ORDER BY 
    `cust_id` 
関連する問題