我正在旋转试图找出我需要使用的SQL查询。我尝试了各种嵌套查询和自联接,一切都让我失望。我想我是在思考它。
基本想法:我有一个表格,我们称之为OrderTable
,表格中有四个(相关)字段:OrderId
,CustomerId
,RestaurantId
, OrderTime
当客户下订单时,日期/时间戳会添加到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
)
答案 0 :(得分:1)
我可能会对你要求的内容感到有些困惑,但是如果你将子查询从'='改为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";
这不会给你你想要的清单吗?