2012-01-14 5 views
1

Я думал о способе использования одного запроса с подзапросом вместо использования двух отдельных запросов.Как ограничить запросы подзапроса одним?

Но получается, что подзапрос вызывает несколько запросов для каждой строки в наборе результатов. Есть ли способ ограничить результат подзапроса счетчика только одним с комбинированным запросом?

SELECT `ad_general`.`id`, 
    (SELECT count(`ad_general`.`id`) AS count 
     FROM (`ad_general`) 
     WHERE `city` = 708) AS count, 
    FROM (`ad_general`) 
    WHERE `ad_general`.`city` = '708' 
    ORDER BY `ad_general`.`id` DESC 
    LIMIT 15 

Может быть, использование соединения может решить проблему, но dunno how?

+0

Почему 708 в кавычках в одной части запроса, но не в другом? Является ли ad_general.city строкой или целым числом? –

+0

целое число, но я не думаю, что нет никаких существенных различий, вызываемых кавычками. – motto

+1

Обратите внимание, что вы можете [форматировать строки как код] (http://meta.stackexchange.com/questions/22186/), отложив их в четыре пробела. Кнопка «{}» на панели инструментов редактора делает это за вас. Значение больше, чем ('>'), предназначено для цитирования блока текста откуда-то. Нажмите оранжевую метку вопроса на панели инструментов редактора, чтобы получить дополнительную информацию и советы по форматированию. – outis

ответ

1
SELECT ad_general.id, stats.cnt 
FROM ad_general 
    JOIN (
     SELECT count(*) as cnt 
     FROM ad_general 
     WHERE city = 708 
    ) AS stats 
WHERE ad_general.city = 708 
ORDER BY ad_general.id DESC 
LIMIT 15; 

Явные имен таблиц не требуется, но используются как для ясности и ремонтопригодности (явные имена таблиц предотвратят любые imbiguities должна схема для ad_general или генерируемая таблица никогда не меняется).

+0

спасибо тонну !, вот что я искал. и это определенно быстрее, чем первый запрос. – motto

+0

Я думаю, что outis отредактировал по неизвестной причине ваш ответ и отредактированная версия не работают. – motto

+0

@motto, я не вижу ошибки. это похоже на то же самое более явное и больше символов для ввода. Я не разделяю его взглядов на форматирование, но не начну войну редактирования =) – newtover

0

Вы можете самостоятельно присоединяться (присоединить таблицу к себе таблицу) и применить функцию агрегата ко второму.

SELECT `adgen`.`id`, COUNT(`adgen_count`.`id`) AS `count` 
    FROM `ad_general` AS `adgen` 
    JOIN `ad_general` AS `adgen_count` ON `adgen_count`.city = 708 
    WHERE `adgen`.`city` = 708 
    GROUP BY `adgen`.`id` 
    ORDER BY `adgen`.`id` DESC 
    LIMIT 15 

Однако невозможно сказать, что такое соответствующая группировка, не зная структуры таблицы.

+0

не работает.бесполезно – motto

+0

@motto: он не работает, потому что вы не дали нам достаточной информации для написания рабочего запроса. Прочитайте документы, с которыми я связан ранее, и обновите свой вопрос. – outis

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