MySql使用嵌套查询检查当前记录的最旧记录

时间:2012-08-15 15:35:23

标签: mysql self-join nested-queries

我正在旋转试图找出我需要使用的SQL查询。我尝试了各种嵌套查询和自联接,一切都让我失望。我想我是在思考它。

基本想法:我有一个表格,我们称之为OrderTable,表格中有四个(相关)字段:OrderIdCustomerIdRestaurantIdOrderTime

当客户下订单时,日期/时间戳会添加到OrderTime字段。其他三个字段只是整数,OrderId字段作为主键(并自动增加)。

我正在尝试编写一个查询,该查询将返回CustomerId条记录列表,其中该客户的第一条记录(最早的日期)是特定日期(比如说'2012-03-14')和RestaurantId是一个特定的数字(比方说29)。

目前我拥有的只能是一种过于复杂的方式。此外,当有多个匹配我的子查询的记录时,我当前收到错误“#1242 - 子查询返回超过1行”。

任何人都可以帮我找到更优雅的解决方案吗?谢谢!

CURRENT QUERY:

SELECT `CustomerId` 
FROM `OrderTable` 
WHERE `OrderTime` LIKE '%2012-03-14%' 
AND `RestaurantId`='29' 
AND `OrderId`=(SELECT `OrderId` 
   FROM `OrderTable` 
   WHERE `RestaurantId`='29' 
   GROUP BY `CustomerId` 
   ORDER BY `OrderTime` ASC
   )

3 个答案:

答案 0 :(得分:1)

编辑:John Totet Woo可能是对的,但仍然参考我的帖子的第二部分来避免LIKE条款:)

我可能会对你要求的内容感到有些困惑,但是如果你将子查询从'='改为IN,你会得到你想要的东西吗?

SELECT `CustomerId` 
FROM `OrderTable` 
WHERE `OrderTime` LIKE '%2012-03-14%' 
AND `RestaurantId`='29' 
AND `OrderId` IN (SELECT `OrderId` 
    FROM `OrderTable` 
    WHERE `RestaurantId`='29' 
    GROUP BY `CustomerId` 
    ORDER BY `OrderTime` ASC
) 

尽管困扰我的是,你可以使用

AND DATE(OrderTime) = '2012-03-14'

而不是LIKE

答案 1 :(得分:0)

您的当前可以返回多个值。 =符号只需要子查询中的一个值,为此,您需要使用LIMIT关键字限制子查询的值。

SELECT `CustomerId` 
FROM   `OrderTable` 
WHERE  `OrderTime` LIKE '%2012-03-14%' AND 
       `RestaurantId`='29' AND 
       `OrderId`= (
                     SELECT `OrderId` 
                     FROM `OrderTable` 
                     WHERE `RestaurantId`='29' 
                     ORDER BY `OrderTime` ASC
                     LIMIT 1
                  )

你也可以这样做:

SELECT DISTINCT CustomerID
FROM OrderTable
WHERE OrderID IN
(
    SELECT  OrderID
    FROM    OrderTable 
    WHERE   RestaurantID = 29 AND
            DATE(OrderTime) = DATE(2012-03-14)
) b

最简单解决方案就是:

    SELECT  DISTINCT CustomerID
    FROM    OrderTable 
    WHERE   RestaurantID = 29 AND
            DATE(OrderTime) = DATE(2012-03-14)

答案 2 :(得分:0)

我想我很困惑。为什么你不能像这样选择所有与OrderTime和Restaurant ID相同的记录?

SELECT * FROM OrderTable WHERE OrderTime = "2012-03-14" AND RestaurantID = "29";

这不会给你你想要的清单吗?