3

LEFT JOIN クエリを使用して、1 対多の関係を持つ 2 つのテーブルからいくつかの結果を取得しようとしていますが、「子」の数に基づいて結果セットを制限しています。次のような構造の 2 つのテーブルがあります。

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

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

(テーブル内の残りのデータは、このクエリには関係ありません。)

私がやりたいのは、すべての顧客 ID とその注文 ID を顧客別に並べ替えて取得することですが、複数の注文を行った顧客に限定されます。この例では、結果は次のようになります。

cust_id    order_id
1          100
1          102

基本的な LEFT JOIN から始めて、注文 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`

皆さんありがとう。

4

5 に答える 5

7

1 つの方法は、複数の注文がある顧客を取得するインライン ビューを作成し、それに内部結合することです。JOIN が気に入らない場合は、IN または EXISTS を実行することもできます。

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`
于 2012-05-08T22:05:17.040 に答える
1

ちょっと遅いと思いますが、とにかく答えを投稿します。少し異なりますが、それでも機能します。

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`
于 2012-05-08T22:18:24.627 に答える
1

まず、結合を外部のままにする必要はありません。これと内部結合の唯一の違いは、注文のない顧客を含めることであり、注文が 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`
于 2012-05-08T22:12:16.880 に答える
0

まだ注文していない顧客を除外する場合は、LEFTJOINは不要です。

結果セットに注文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`

ご不明な点がございましたらお知らせください

于 2012-05-08T22:16:53.190 に答える
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`
于 2012-05-09T00:32:46.260 に答える