簡體   English   中英

在MySQL中對子查詢使用LIMIT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM