2015-01-22 2 views
0

я построил следующий запрос:Неправильная строка индекса при группировке

SELECT 
    p.id, 
    p.tag_id, 
    p.title, 
    p.created_at, 
    @indexer := @indexer + 1 AS indexer 
FROM 
    `posts` AS p 
LEFT JOIN 
    `votes` AS v 
     ON p.id = v.votable_id 
     AND v.votable_type = "Post" 
     AND v.deleted_at IS NULL 
JOIN 
    (SELECT @indexer := 0) AS i 
WHERE 
    p.deleted_at IS NULL 
GROUP BY 
    p.id 

В результате я получаю с этим:

+----+--------+------------------------------------+---------------------+---------+ 
| id | tag_id |    title    |  created_at  | indexer | 
+----+--------+------------------------------------+---------------------+---------+ 
| 2 |  2 | PostPostPost      | 2014-10-23 23:53:15 |  248 | 
| 3 |  3 | Title        | 2014-10-23 23:56:13 |  6 | 
| 4 |  2 | GIFGIFIGIIF      | 2014-10-23 23:59:03 | 1316 | 
| 5 |  2 | GIFGIFIGIIF      | 2014-10-23 23:59:03 | 1317 | 
| 6 |  4 | My new avatar      | 2014-10-26 22:22:30 | 1318 | 
| 7 |  5 | Hi, haiii, oh Hey !    | 2014-10-26 22:38:10 |  1 | 
| 8 |  6 | Mclaren testing stealth technology | 2014-10-26 22:44:15 |  5 | 
| 9 |  7 | Just random thoughts while pooping | 2014-10-26 22:50:03 |  2 | 
+----+--------+------------------------------------+---------------------+---------+ 

Тем не менее, я ожидал этого:

+----+--------+------------------------------------+---------------------+---------+ 
| id | tag_id |    title    |  created_at  | indexer | 
+----+--------+------------------------------------+---------------------+---------+ 
| 2 |  2 | PostPostPost      | 2014-10-23 23:53:15 |  1 | 
| 3 |  3 | Title        | 2014-10-23 23:56:13 |  2 | 
| 4 |  2 | GIFGIFIGIIF      | 2014-10-23 23:59:03 |  3 | 
| 5 |  2 | GIFGIFIGIIF      | 2014-10-23 23:59:03 |  4 | 
| 6 |  4 | My new avatar      | 2014-10-26 22:22:30 |  5 | 
| 7 |  5 | Hi, haiii, oh Hey !    | 2014-10-26 22:38:10 |  6 | 
| 8 |  6 | Mclaren testing stealth technology | 2014-10-26 22:44:15 |  7 | 
| 9 |  7 | Just random thoughts while pooping | 2014-10-26 22:50:03 |  8 | 
+----+--------+------------------------------------+---------------------+---------+ 

Подсказка: Проблема с indexer полем. Это произошло после добавления инструкции GROUP BY.

Я пробовал перемещать JOIN (SELECT @indexer := 0) AS i вокруг, меняя его на дополнительный выбор, но без изменений. В любом случае, индексы прикручиваются.

Как исправить это, чтобы указатели были правильными?
И какова причина этой проблемы?

+1

Это связано с тем, когда mysql оценивает '@i: = @i + 1'. это происходит в другое время в последовательности выполнения, чем вы ожидаете, и даете вам эти неуклюжие номера. он правильно вычисляет 'i ++', но mosf строк результатов отбрасывается вашим соединением и/или где, вызывая «пробелы» в seqeuence. на самом деле нет никаких пробелов, но строки сбрасываются, создавая иллюзию пробелов. –

ответ

0

Нашел ответ сам, пришлось разделить запрос на несколько подзапросов.

SELECT 
    mq.*, 
    @indexer := @indexer + 1 AS indexer 
FROM 
(
    SELECT 
     p.id, 
     p.tag_id, 
     p.title, 
     p.created_at 
    FROM 
     `posts` AS p 
    LEFT JOIN 
     `votes` AS v 
      ON p.id = v.votable_id 
      AND v.votable_type = "Post" 
      AND v.deleted_at IS NULL 
    WHERE 
     p.deleted_at IS NULL 
    GROUP BY 
     p.id 
) AS mq 
JOIN 
    (SELECT @indexer := 0) AS i 

Очевидно, что вызвало огромное количество строк, доступных для запроса (как в EXPLAIN), но удалось зафиксировать, что тоже с дополнительными индексами. Полный ответ на эту проблему можно найти здесь: Calculating row indices with subquery having joins, results in A*B examined rows

Смежные вопросы