4

この SQL クエリを使用して、テーブルを調べて顧客名を検索し、その行の ID と日付の列を返します。

SELECT custName, date, id FROM booking
WHERE custName LIKE '%$s'
OR custName LIKE '$s%'

($s は PHP 変数です)

John Dorian を探している場合、$s を名の John または苗字の Dorian として入力すると、関数は彼を見つけます。私の問題は、John Dorian が複数の行に表示される可能性があることです。その場合、クエリで最新の行のみを返すようにします (日付列を使用してこれを把握します)。

私のテーブルが次のように見え、$s = John の場合:

(custName, date, id)
John Dorian - 2013/01/01 - 1
John Doe - 2013/01/02 - 2
John Dorian - 2013/01/10 - 3

クエリを返したい

John Doe - 2013/01/02 - 2
John Dorian - 2013/01/10 - 3
4

4 に答える 4

2

どうですか:

SELECT custName, date, id 
FROM booking b
INNER JOIN
(
    SELECT max(date) MaxDate, custName
    FROM booking
    WHERE custName LIKE '%$s%'
    GROUP BY custName
) bm
  ON b.custName = bm.custName
  AND b.date = bm.maxDate
WHERE custName LIKE '%$s%'
ORDER BY b.date DESC
于 2013-09-13T01:51:35.643 に答える
1

DISTINCT1)またはを使用して、顧客ごとに 1 つの行のみを簡単に検索して取得できますGROUP BY

SELECT DISTINCT custName
FROM booking
WHERE custName LIKE '%$s' OR custName LIKE '$s%';

また

SELECT custName
FROM booking
WHERE custName LIKE '%$s' OR custName LIKE '$s%'
GROUP BY custName;

2) 集計関数 (つまりMAX) をGROUP BY

SELECT custName, MAX(date) as date
FROM booking
WHERE custName LIKE '%$s' OR custName LIKE '$s%'
GROUP BY custName;

3) 最後に、結果を元のテーブルに結合して、完全なテーブル行を取得できます。

SELECT b.custName, b.date, b.id
FROM booking AS b
INNER JOIN
    (SELECT custName, MAX(date) AS maxDate
    FROM booking
    WHERE custName LIKE '%$s' OR custName LIKE '$s%'
    GROUP BY custName
    ) AS gb
ON b.custName = gb.custName AND b.date = gb.maxDate;

または(おそらく遅い):

SELECT b.custName, b.date, b.id
FROM booking AS b
INNER JOIN
    (SELECT custName, MAX(date) AS maxDate
    FROM booking
    GROUP BY custName
    ) AS gb
ON b.custName = gb.custName AND b.date = gb.maxDate
WHERE b.custName LIKE '%$s' OR b.custName LIKE '$s%';

ps

以下は有望に見えるかもしれませんし、時には正しい結果が得られるかもしれませんが、動作することは保証されていません.

SELECT *
FROM (
   SELECT custName, date, id
   FROM booking
   WHERE b.custName LIKE '%$s' OR b.custName LIKE '$s%'
   ORDER BY date DESC
) AS t
GROUP BY custNAME;

GROUP BY残念ながら、提供された順序を維持するために に頼ることはできません。

編集こちらもご覧ください

于 2013-09-13T05:12:31.810 に答える
0

custName 列に個別が必要だと思います。私はこれを自分で試したことはありませんが、BadWolf の答えは「John Dorian」という名前の両方の行を返すと思います。

SELECT distinct(custName), date, id FROM booking WHERE 
custname LIKE '%$s%' 
GROUP BY custName, date, id
ORDER BY date DESC
于 2013-09-13T02:01:21.083 に答える
0

一見、簡単な質問だと思ったのですが、違います。

私は次のステートメントによってのみうまくいくことができます。

select * from 
   (SELECT custName, date, id FROM booking 
          WHERE custName LIKE '%$s' OR 
          custName LIKE '$s%' order by date desc) as t 
   group by (t.custName) order by date ;

他のより良い解決策があるかもしれません。

于 2013-09-13T02:17:28.860 に答える