0

Box と Schedule という、遠い関係にある 2 つの mySQL テーブルがあります。

テーブルは、他の多くのテーブル結合によってのみ関連付けられます。

ボックスにはサブスクリプション ID があり、サブスクリプションには boxContent ID があり、boxContent にはスケジュール ID があります。

多くのボックスには 1 つのサブスクリプションがあります 1 つのサブスクリプションには多くの boxContents があります 多くの boxContents には 1 つのスケジュールがあります

箱に添付されているスケジュールの詳細をすべて取得し、箱の配達日別にグループ化する必要があります。

私が抱えている問題は、サブスクリプションとボックスコンテンツのデータが無効な結果で結果を埋めないように、それらをグループ化または結合する方法がわからないことです。

例えば:

SELECT 
    Box.expected_delivery_date, count(Box.id) num_boxes
FROM
    Box

WHERE
    Box.state = 3 AND Box.status = 2
GROUP BY Box.expected_delivery_date;

探す必要がある正しい数のボックスを返します。

2010-10-01 - 2
2010-10-07 - 4

ただし、2 つをリンクする必要があるテーブルを含めると、すべてのデータが結果を混乱させます。

SELECT 
    Box.expected_delivery_date, count(Box.id) num_boxes
FROM
    Box
        JOIN
    Subscription ON Box.subscription_id = Subscription.id
        JOIN
    BoxContent ON Subscription.id = BoxContent.subscription_id
        JOIN
    Schedule ON Schedule.id = BoxContent.schedule_id
WHERE
    Box.state = 3 AND Box.status = 2
GROUP BY Box.expected_delivery_date;

戻り値:

2010-10-01 - 10
2010-10-07 - 17

これを行う簡単な方法があると確信していますが、SQLが得意ではありません。

4

2 に答える 2

2

DISTINCTクエリの個別をカウントするために使用しBox.idます-

SELECT 
    Box.expected_delivery_date, count(DISTINCT Box.id) num_boxes
FROM
    Box
        JOIN
    Subscription ON Box.subscription_id = Subscription.id
        JOIN
    BoxContent ON Subscription.id = BoxContent.subscription_id
        JOIN
    Schedule ON Schedule.id = BoxContent.schedule_id
WHERE
    Box.state = 3 AND Box.status = 2
GROUP BY Box.expected_delivery_date;

これは戻るはずです

2010-10-01 - 2
2010-10-07 - 4

同様に、JOINサブスクリプション、コンテンツ、スケジュール テーブルをボックス化すると、多くの重複が発生します。データを分析し、必要な方法を確認する必要がありますGROUP BY

このクエリを使用して、グループ化する前にクエリで使用される実際のデータを確認し、グループ化する列を決定します。ほとんどの場合、複数の行で重複データが表示されるのは列です。

SELECT 
    Box.expected_delivery_date, Box.id BoxID, Schedule.id SchID
FROM
    Box
        JOIN
    Subscription ON Box.subscription_id = Subscription.id
        JOIN
    BoxContent ON Subscription.id = BoxContent.subscription_id
        JOIN
    Schedule ON Schedule.id = BoxContent.schedule_id
WHERE
    Box.state = 3 AND Box.status = 2

上記のクエリを試しSELECT Box.*, Schedule.*て、最終的なグループ化を行うこともできます。

より具体的な回答が必要な場合は、これらすべてのテーブルのダミー データと探している結果を提供する必要があります。

于 2013-09-17T14:55:46.537 に答える
1

コメントに同意し、使用してみDISTINCTます。これにより、「中間」テーブルを結合することで得られる重複行が除外されます。

于 2013-09-17T14:55:28.877 に答える