2014-09-25 108 views
0

在我的數據庫中,潛在顧客可以有很多任務,因此任務表有一個taskable_id和taskable_type,其中taskable_id是lead的id,taskable_type是Lead,遵循Ruby on Rails多態約定。在Mysql中使用LIMIT子查詢

我想爲約會狀態爲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 | 
+0

你第二個選項無'on'關鍵字,所以你的連接無效。你基本上將內連接(foo)作爲t1(bar)作爲t2' – 2014-09-25 18:03:09

+0

你可以顯示一些示例數據嗎? – Mihai 2014-09-25 18:03:31

+0

@MarcB但是我沒有看到在這裏會有用的地方。 t1和t2之間沒有關係。我只是想爲所有潛在客戶找到第一個任務。 – Donato 2014-09-25 18:05:17

回答

0

一些實驗後,似乎我得到它的工作:

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

的方法沒有的UserVars:

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)