Подзапрос без условия where - PullRequest
0 голосов
/ 24 января 2012

Вот мой код

SELECT res.type, 
       res.contactname, 
       res.id, 
       res.inv_addressline2, 
       res.inv_addressline3, 
       res.signup_date,
       res.engineer_id_global, 
       res.job_id_global, 
       res.neg_or_pos, 
       res.rating, 
       res.author_id_global,
       res.timestamp_global, 
       res.short_description, 
       res.job_title, 
       res.feedback, 
       author_data.contactname AS `author_name`, 
       review_count.total_feedback, 
       review_count.total_rating 
FROM (SELECT mb.type, 
             mb.contactname, 
             mb.id, 
             mb.inv_addressline2, 
             mb.inv_addressline3, 
             mb.signup_date,
             fb.engineer_id AS `engineer_id_global`, 
             fb.timestamp AS `timestamp_global`, 
             fb.job_id AS `job_id_global`, 
             fb.neg_or_pos, 
             fb.rating, 
             fb.feedback, 
             fb.author_id AS `author_id_global`,
             ac.engineer_id, 
             ac.timestamp, 
             ac.author_id,
             jb.job_id, 
             SUBSTR(jb.job_description, 1, 200) AS `short_description`, 
             jb.job_title 
      FROM " . MEMBERS_TABLE . " AS mb 
      LEFT JOIN " . ACCEPTED . " AS ac 
             ON mb.id = ac.engineer_id 
      LEFT JOIN " . FEEDBACK . " AS fb 
             ON ac.job_id = fb.job_id 
      LEFT JOIN " . JOBS . " AS jb 
             ON fb.job_id = jb.job_id 
      WHERE mb.type = 2 
      ORDER BY
            fb.timestamp DESC
     ) AS res 
LEFT JOIN
    (SELECT mb.id, 
            mb.contactname, 
            fb.author_id 
     FROM " . MEMBERS_TABLE . " AS mb 
     LEFT JOIN " . FEEDBACK . " AS fb 
            ON fb.author_id = mb.id 
     LIMIT 1
    ) AS `author_data`  
       ON res.author_id_global = author_data.author_id 
LEFT JOIN
    (SELECT COUNT(fb.engineer_id) AS `total_feedback`, 
            SUM(fb.rating) AS `total_rating`, 
            fb.engineer_id 
     FROM " . FEEDBACK . " AS fb 
    ) AS `review_count` 
       ON res.engineer_id_global = review_count.engineer_id 
GROUP BY res.contactname
ORDER BY res.contactname

Я только начинаю разбираться в SQL.Меня беспокоит второй и третий внутренний запрос.Прав ли я, говоря, что он вернет все результаты, так как предложение where отсутствует, а результаты будут возвращены с помощью оператора ON или оператор ON включен вместе с исходным запросом?

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Существует ряд проблем с этим сценарием:

  • У вас есть несколько таблиц с именами, такими как " . MEMBERS_TABLE . ", " . ACCEPTED . " и т. Д.Это маловероятно, чтобы быть приемлемым в MySQL, который обычно использует backticks (`) для цитирования имен объектов;если этот сценарий должен быть предварительно обработан, например,Perl или Python, или часть более крупного скрипта на другом языке, было бы полезно сказать об этом.
  • У вас есть предложение order by, без видимой причины, в вашем первом подзапросе.Это может быть удалено.
  • Ваш второй подзапрос связывает FEEDBACK с MEMBERS_TABLE и ограничивает результаты 1, не указывая author_id внутри подзапроса - это означает, что один случайный элемент будет выбран внутриподзапрос, затем связанный с остальной частью набора данных по определенному идентификатору автора, который не будет совпадать для большей части остальной части набора данных.
    • Таблица FEEDBACK здесь совершенно неактуальна и может быть удалена.
    • Если id однозначно идентифицирует запись в MEMBERS_TABLE, подзапрос может быть полностью удален и заменен одним левымприсоединиться к MEMBERS_TABLE на res.author_id_global = MEMBERS_TABLE.id.Предложение limit не требуется.
    • Если id не уникально идентифицирует запись в MEMBERS_TABLE, подзапрос должен быть переписан как select distinct id, contact_name FROM " . MEMBERS_TABLE . " AS mb where res.author_id_global = mb.id LIMIT 1.Если существует несколько подходящих авторов для одного и того же id, один из них будет выбран случайным образом.
  • Третий подзапрос не требует предложения where - он суммирует всеотзывы и оценки инженеров по инженерам в подзапросе, и каждый инженер будет связан с соответствующим инженером из остальной части набора данных условием on из условия left join.
0 голосов
/ 24 января 2012

Второй внутренний запрос имеет предел 1. Это не что иное, как условие, чтобы показать только один результат. Третий внутренний запрос не имеет никаких проблем.

...