11

次のSQLクエリとMySQLに問題があります

SELECT
  id, cpid, label, cpdatetime
FROM
  mytable AS a
WHERE
  id NOT IN
  (
    SELECT
      id
    FROM
      mytable AS b
    WHERE
      a.label = b.label
    AND
      a.cpdatetime > b.cpdatetime
  )
AND
  label LIKE 'CB%'
AND
  cpid LIKE :cpid
GROUP BY label
ORDER BY cpdatetime ASC

テーブルはこんな感じ

1 | 170.1 | CB55 | 2013-01-01 00:00:01
2 | 135.5 | CB55 | 2013-01-01 00:00:02
3 | 135.6 | CB59 | 2013-01-01 00:00:03
4 | 135.5 | CM43 | 2013-01-01 00:00:04
5 | 135.5 | CB46 | 2013-01-01 00:00:05
6 | 135.7 | CB46 | 2013-01-01 00:00:06
7 | 170.2 | CB46 | 2013-01-01 00:00:07

クエリを返したい

3 | 135.6 | CB59
5 | 135.5 | CB46

編集

ラベルは犬/猫であり、cpidsは犬/猫を飼っている一時的な家族です。

犬/猫は家族から家族へと移動します。

:userinputファミリーに属していた犬/猫を見つける必要がありますが、以前は別のファミリーに属していなかった場合に限ります。

データベースを変更することはできず、データをそのまま処理する必要があります。アプリケーション/データベーススキーマを作成したのは私ではありません。

4

2 に答える 2

6

次を使用して、相関サブクエリを回避してくださいLEFT JOIN

SELECT a.id, a.cpid, a.label, a.cpdatetime
FROM mytable AS a
LEFT JOIN mytable AS b ON a.label = b.label AND a.cpdatetime > b.cpdatetime
WHERE a.label LIKE 'CB%' AND a.cpid LIKE :cpid
  AND b.label IS NULL
GROUP BY a.label
ORDER BY a.cpdatetime ASC

フィドル

結合条件が失敗した場合、2 番目のテーブル エイリアスのフィールドはbに設定されNULLます。

または、相関関係のないサブクエリを使用します。

SELECT a.id, a.cpid, a.label, a.cpdatetime
FROM mytable AS a
INNER JOIN (
  SELECT label, MIN(cpdatetime) AS cpdatetime
  FROM mytable
  WHERE label LIKE 'CB%'
  GROUP BY label
) AS b ON a.label = b.label AND a.cpdatetime = b.cpdatetime
WHERE a.cpid LIKE '135%'
ORDER BY a.cpdatetime

まず、各ラベルの最小値を見つけてから、追加の条件cpdatetimeを追加する最初のテーブルと結合します。cpid

于 2013-02-22T06:53:05.720 に答える
1

これが本当にやりたいことだと思います。各ラベルの最も古い ID である ID を選択し、それらの中から 135 cpid と CB ラベルのレコードを選択します。

SELECT
  A.id, cpid, A.label, cpdatetime
FROM
  mytable AS a inner join
 (select id, label from mytable
  group by label
  having min(cpdatetime)) as b
on A.label=B.label and A.id=B.id
WHERE
  A.label LIKE 'CB%'
AND
  cpid LIKE '135%'
GROUP BY A.label
ORDER BY cpdatetime ASC;

http://sqlfiddle.com/#!2/ccccf/16

于 2013-02-22T06:46:22.763 に答える