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 可能出现在不止一行中,如果是这种情况,我希望查询只返回最近的行(使用日期列来解决这个问题)。

IE 如果我的表看起来像这样并且 $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)您可以使用or轻松搜索并获得每位客户仅一行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 回答