2010-05-30 1 views
1

Ниже приводится более упрощенный вариант таблицы я использую:Mysql проблема запроса

 
fruits 
+-------+---------+ 
| id | type | 
+-------+---------+ 
| 1  | apple | 
| 2  | orange | 
| 3  | banana | 
| 4  | apple | 
| 5  | apple | 
| 6  | apple | 
| 7  | orange | 
| 8  | apple | 
| 9  | apple | 
| 10 | banana | 
+-------+---------+ 

Ниже приведены два запроса интереса:

SELECT * FROM fruits WHERE type='apple' LIMIT 2; 

SELECT COUNT(*) AS total FROM fruits WHERE type='apple'; // output 6 

Я хочу, чтобы объединить эти два запроса так что результаты выглядит следующим образом:

 
+-------+---------+---------+ 
| id | type | total | 
+-------+---------+---------+ 
| 1  | apple | 6  | 
| 4  | apple | 6  | 
+-------+---------+---------+ 

выход должен быть ограничен 2 записей, но она также должна содержать TOTA l количество записей типа apple.

Как это сделать с 1 запросом?

+0

что цель такого запроса? –

+0

Это сокращенная версия таблицы, которую я использую, которая будет иметь более миллиона записей, и ей не хватает 5 других столбцов. Я поставил эту таблицу для простоты. Сейчас я использую 2 запроса, но задаюсь вопросом, как это может быть достигнуто с помощью 1 запроса (для целей обучения). – Yeti

+0

Похоже, вы упростили его, и это может ввести в заблуждение тех, кто попытается ответить. Лично я предпочитаю разумные вопросы. –

ответ

2
SELECT *, (SELECT COUNT(*) AS total FROM fruits WHERE type='apple') AS Total 
FROM fruits WHERE type='apple' LIMIT 2; 

В зависимости от того, как MySQL интерпретирует его, он может кэшировать внутренний запрос, чтобы он не пересматривал его для каждой записи.

Другой способ сделать это с помощью вложенного запроса и объединения (это было бы полезно это вам нужно больше, чем один тип фруктов, например):

SELECT fruits.*, counts.total 
FROM fruits 
    INNER JOIN (SELECT type, COUNT(*) AS total FROM fruits GROUP BY type) counts ON (fruits.type = counts.type) 
WHERE fruits.type='apple' 
LIMIT 2; 
+0

Эй, @Lost, не ваши текущие 2 вопроса проще, чем этот монстр? ;) –

+0

@col: Ну, может быть. Но мне было любопытно научиться делать это с помощью одного запроса. И да, хотя это может показаться не очень красивым, я предпочитаю использовать 1 запрос вместо 2. – Yeti

+0

@Lost, и вы ошибетесь. Нет ни единой выгоды в этом. –

1

Для этого вы должны использовать SQL_CALC_FOUND_ROWS.

SELECT SQL_CALC_FOUND_ROWS * FROM fruits WHERE type='apple' LIMIT 2; 

возвратит идентификаторы ваших яблок, и помните, сколько было бы возвращено без предложения LIMIT

SELECT FOUND_ROWS(); 

возвратит сколько яблок было бы найти, без предельного заявления.

+1

Вы должны поместить SQL_CALC_FOUND_ROWS в условные комментарии, хотя, чтобы позволить изящную ошибку на SQL-серверах, которые ее не поддерживают. – Konerak