1

顧客に 4 週間以上誰もコメントしていない場合に、その顧客に関する最後のコメントを取得するクエリを設定する必要があります。以下のクエリを使用して動作させることができますが、何らかの理由でコメント列に最新のレコードが表示されません。代わりに最も古いものを表示しますが、日付は最も新しいものを表示します。私がSQLの初心者だからかもしれませんが、ここで何が間違っているのでしょうか?

SELECT DISTINCT
    customerid, id, customername, user, MAX(date) AS 'maxdate', comment
FROM comments
WHERE customerid IN 
   (SELECT DISTINCT id FROM customers WHERE pastdue='1' AND hubarea='1') 
AND customerid NOT IN 
   (SELECT DISTINCT customerid FROM comments WHERE DATEDIFF(NOW(), date) <= 27)
GROUP BY customerid
ORDER BY maxdate

最初の「WHERE」句は、特定の地域の顧客のみを表示し、「期限切れが有効」であることを確認するだけです。2 つ目は、顧客が過去 27 日以内にコメントされていないことを確認します。これは、個々の顧客に関連付けられている番号であるため、customerid によってグループ化されています。結果が出たら、コメント欄以外はすべて正しいです...何かアイデアはありますか?

4

5 に答える 5

1

ネストされたクエリに結合する方がはるかに優れているため、ネストされたクエリの代わりに結合を使用します 結合すると、このクエリが問題を解決する速度が向上します。

SELECT DISTINCT customerid,id, customername, user, MAX(date) AS 'maxdate', comment FROM comments inner join customers on comments.customerid = customers.id WHERE comments.pastdue='1' AND comments.hubarea='1' AND DATEDIFF(NOW(), comments.date) <= 27 GROUP BY customerid ORDER BY maxdate

于 2012-10-06T05:47:10.417 に答える
0

テーブルの 2 つの列が、集計関数にも GROUP BY 句にも含まれていません。たとえば、顧客 ID と日付が同じで、コメント データが異なる 2 つのデータ行があるとします。SQL はこれら 2 つの行をどのように集計する必要がありますか? :( エラーが発生します...

于 2012-10-06T05:45:11.270 に答える
0

これを試して

select  customerid, id, customername, user,date, comment from(
  select customerid, id, customername, user,date, comment, 
      @rank :=  IF(@current_customer = id, @rank+ 1, 1),
      @current_customer := id
    from comments
    where customerid IN 
      (SELECT DISTINCT id FROM customers WHERE pastdue='1' AND hubarea='1') 
      AND customerid NOT IN 
      (SELECT DISTINCT customerid FROM comments WHERE DATEDIFF(NOW(), date) <= 27)
    order by customerid, maxdate desc
) where rank <= 1
于 2012-10-06T05:35:56.860 に答える
0

ケースごとにサブクエリが必要です。

SELECT  a.*
FROM    comments a
        INNER JOIN
        (
            SELECT customerID, max(`date`) maxDate
            FROM    comments
            GROUP BY customerID
        ) b ON a.customerID = b.customerID AND
                a.`date` = b.maxDate
        INNER JOIN
        (
            SELECT DISTINCT ID
            FROM customers
            WHERE pastdue = 1 AND hubarea = 1
        ) c ON c.ID = a.customerID
        LEFT JOIN
        (
            SELECT DISTINCT customerid 
            FROM comments 
            WHERE DATEDIFF(NOW(), date) <= 27
        ) d ON a.customerID = d.customerID
WHERE   d.customerID IS NULL
  • 最初の結合では、各顧客の最新のレコードが取得されます。
  • 2 番目の結合は、特定の地域の顧客のみを表示し、それらが「期限切れ対応」であることを示しています。
  • を使用する 3 番目の結合はLEFT JOIN、過去 27 日以内にコメントされていないすべての顧客を選択します。この場合、条件により、リストにないレコードのみが選択されますd.customerID IS NULL

ただし、クエリを短くするために、customersテーブルに顧客のレコードが既にある場合はunique、サブクエリを作成する必要はありません。テーブルを直接結合し、WHERE句に条件を配置します。

SELECT  a.*
FROM    comments a
        INNER JOIN
        (
            SELECT customerID, max(`date`) maxDate
            FROM    comments
            GROUP BY customerID
        ) b ON a.customerID = b.customerID AND
                a.`date` = b.maxDate
        INNER JOIN customers c
            ON c.ID = a.customerID
        LEFT JOIN
        (
            SELECT DISTINCT customerid 
            FROM comments 
            WHERE DATEDIFF(NOW(), date) <= 27
        ) d ON a.customerID = d.customerID
WHERE   d.customerID IS NULL AND
        c.pastdue = 1 AND 
        c.hubarea = 1
于 2012-10-06T05:32:22.257 に答える
0

これはおそらくあなたが達成しようとしていることができると思います。あなたがそれを実行して、実行できるかどうかを報告できる場合は、必要に応じて微調整できます。論理的には、それは「うまくいくはずです」-私があなたの問題を正しく理解していれば:)

SELECT X.customerid, X.maxdate,  co.id, c.customername, co.user, co.comment
FROM 
    (SELECT customerid, MAX(date) AS 'maxdate'
    FROM comments cm
    INNER JOIN customers cu ON cu.id = cm.customerid
    WHERE cu.pastdue='1' 
    AND cu.hubarea='1' 
    AND DATEDIFF(NOW(), cm.date) <= 27)
    GROUP BY customerid) X
INNER JOIN comments co ON X.customerid = co.customerid and X.maxdate = co.date
INNER JOIN customer c  ON X.customerid = c.id
ORDER BY X.maxdate
于 2012-10-06T05:40:56.497 に答える