MySQL оставил присоединенный подзапрос неудачным - PullRequest
5 голосов
/ 19 февраля 2010

Следующий запрос хорошо работает в MySQL 5.x

SELECT
  m_area.id, m_area.cn_areaName, m_area.de_areaName,
  m_area.en_areaName,m_area.jp_areaName,t_shop.count
FROM
  m_area left join   
(
select t_shop.areaID, count(areaID) AS count
from t_shop
group by t_shop.areaID
) t_shop
on m_area.id = t_shop.areaID

Однако, когда мне нужно запустить его в базе данных MySQL 4.0.23 с той же структурой и данными, он просто возвращает следующее сообщение:

1064 - у вас ошибка в синтаксисе SQL.Проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с [[

            select t_shop.areaID, count(areaID) AS count
            from t_s 

. Я пробовал много раз, но все равно не получилось.Разрешено ли левое присоединение к подзапросу в MySQL 4.x?Тогда это означает, что я должен сделать это с временной таблицей?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 19 февраля 2010

Подзапросы были не очень хорошо поддержаны с MySQL 4.0: стало возможным использовать их (по крайней мере, некоторым реальным, полезным способом) с MySQL 4.1 - и MySQL 4.0 действительно устарел, теперь...


См., Например, эту страницу руководства MySQL: 12.2.8.Синтаксис подзапроса (цитирование, выделено) :

Начиная с MySQL 4.1 , поддерживаются все формы и операции подзапроса, которые требуются в стандарте SQL, а также некоторые функции, специфичные для MySQL.

В версиях MySQL до 4.1 необходимо было обойти или избежать использования подзапросов .
Во многих случаях подзапросы могут быть успешно переписаны с использованием объединений и других методов.См. Раздел 12.2.8.11, «Перезапись подзапросов как объединений для более ранних версий MySQL» .

1 голос
/ 19 февраля 2010

take out ", count (areaID) AS count"

Несколько столбцов в подзапросе портят соединение.

Временная таблица должна работать нормально ....

Веселись!

1 голос
/ 19 февраля 2010

Единственное, о чем я мог подумать, это добавить имя таблицы к вашему areaID в подзапросе или переименовать зарезервированное слово count в cnt.

SELECT  m_area.id
        , m_area.cn_areaName
        , m_area.de_areaName
        , m_area.en_areaName
        ,m_area.jp_areaName
        ,t_shop.cnt
FROM     m_area 
        left join ( 
          select     t_shop.areaID
                    , count(t_shop.areaID) AS cnt 
          from       t_shop 
          group by   t_shop.areaID 
        ) t_shop on m_area.id = t_shop.areaID 
...