0

我头晕目眩,试图找出我需要使用的 SQL 查询。我尝试了各种嵌套查询和自连接,但一切都让我失望了。我想我想得太多了。

基本思想:我有一个表,我们称之为,表中OrderTable有四个(相关)字段:OrderId, CustomerId, RestaurantId,OrderTime

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

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

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

谁能帮我一个更优雅的解决方案?谢谢!

当前查询:

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
   )
4

3 回答 3

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'

而不是喜欢

于 2012-08-15T15:46:38.227 回答
0

您的 current 可以返回多个值。该=符号只需要子查询中的一个值,为此,您需要使用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)
于 2012-08-15T15:42:43.500 回答
0

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

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

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

于 2012-08-15T15:47:25.977 回答