[英]Using LIMIT with Subqueries in Mysql
在我的數據庫中,銷售線索可以執行許多任務,因此任務表具有taskable_id和taskable_type,其中taskable_id是Lead的ID,而taskable_type是“ Lead”,遵循Ruby on Rails多態約定。
我想為所有約會狀態為1的銷售線索選擇第一個任務。 結果集應該是任務的集合。 這是我想出的:
SELECT
`tasks`.*
FROM
`tasks`
WHERE `tasks`.`taskable_id` IN (1, 2)
AND
`tasks`.`taskable_type` = 'Lead'
AND
`tasks`.`id`
IN
(
SELECT `tasks`.`id`
FROM `tasks`
WHERE `tasks`.`taskable_id` IN (1, 2)
AND
`tasks`.`taskable_type` = 'Lead'
AND
'appointment_status' = 1
ORDER BY created_at asc
LIMIT 1
);
但這會產生錯誤“此版本的MySQL尚不支持'LIMIT&IN / ALL / ANY / SOME子查詢”。 其他stackoverflow帖子說,對於此錯誤,LIMIT必須在子查詢之外。
這是示例數據:
mysql> SELECT * FROM tasks;
+----+------+--------+-------------+----------+---------------------+---------------------+-----------+---------------------+---------------------+---------------+-------------+
| id | name | status | description | priority | created_at | updated_at | task_type | date_start | date_due | taskable_type | taskable_id |
+----+------+--------+-------------+----------+---------------------+---------------------+-----------+---------------------+---------------------+---------------+-------------+
| 1 | NULL | 2 | NULL | 1 | 2014-09-24 17:53:58 | 2014-09-24 17:53:58 | 1 | 2014-09-25 11:30:00 | 2014-09-25 12:00:00 | Lead | 1 |
| 2 | NULL | 2 | NULL | 1 | 2014-09-25 12:45:50 | 2014-09-25 12:45:50 | 1 | 2014-09-25 12:45:00 | 2014-09-25 13:15:00 | Lead | 2 |
mysql> SELECT id, appointment_status, created_at, updated_at FROM leads;
+----+--------------------+---------------------+---------------------+
| id | appointment_status | created_at | updated_at |
+----+--------------------+---------------------+---------------------+
| 1 | 1 | 2014-09-24 17:45:12 | 2014-09-24 17:53:58 |
| 2 | 1 | 2014-09-25 12:45:46 | 2014-09-25 12:45:50 |
經過一些試驗,看來我可以使用它了:
SELECT
tasks.*
FROM
tasks
INNER JOIN
leads
ON leads.id = tasks.taskable_id AND tasks.taskable_type = "Lead"
WHERE
tasks.taskable_id IN (1, 2)
AND
(
tasks.id =
(
SELECT tasks.id
FROM tasks
WHERE tasks.taskable_id = leads.id
AND
tasks.taskable_type = "Lead"
AND
appointment_status = 1
ORDER BY created_at asc
LIMIT 1
)
)
沒有用戶變量的方法:
SELECT
tasks.*
FROM
(SELECT taskable_id,
MIN(t.created_at) created_at
FROM
tasks t
JOIN
leads l USING (taskable_id)
WHERE
taskable_id IN (1,2)
AND t.taskable_type = 'Lead'
AND l.appointment_status = 1
GROUP BY taskable_id
) x
JOIN
tasks
USING (taskable_id, created_at)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.