2012-06-15 5 views
0

У меня есть две таблицы MySQL, структурированные следующим образом;MySQL Присоединиться и подсчитать запрос

объявление

+-------------------+--------------+ 
| Field    | Type   | 
+-------------------+--------------+ 
| id    | int(11)  | 
| title    | varchar(150) | 
+-------------------+--------------+ 

advert_interest_record

+--------------+------------+ 
| Field  | Type  | 
+--------------+------------+ 
| id   | int(11) | 
| advert_id | int(11) | 
| message  | longtext | 
+--------------+------------+ 

Я хочу, чтобы выбрать список всех записей из таблицы «рекламной» - и получить количество строк из таблицы «advert_interest_record», где реклама .id = response.advert_id.

SQL, который я использую для объединения таблиц, выглядит следующим образом:

SELECT advert.id, advert.title 
FROM advert 
LEFT JOIN advert_interest_record ON advert.id = advert_interest_record.advert_id 
GROUP BY advert_interest_record.advert_id 

Первая проблема у меня в том, что, когда нет записей в «advert_interest_record» таблица, запись из таблицы «рекламной» не включена в результате - и мне нужно, чтобы это было ,

Мой второй вопрос: как я могу подсчитать строки в таблице «advert_interest_record»?

Любые советы по этому вопросу будут оценены по достоинству.

Спасибо.

ответ

3

Прежде всего; вы выбираете два поля из таблицы объявлений; в то время как gouping в одном поле из таблицы advert_interest_record.

Предполагая, что для всех значений advert.id значение advert.title будет одинаковым, оно может дать правильные результаты.

Anyways; так как вы хотите, чтобы данные в рекламе были ведущими, лучше всего группировать поля этой таблицы, которые вы хотите однозначно вернуть (что также помогает в получении количества записей, связанных с этим в другой таблице).

Например, вы можете запросить следующие:

SELECT a.id, a.title, COUNT(air.id) 
FROM advert a 
LEFT JOIN advert_interest_records air ON a.id = air.advert_id 
GROUP BY a.id, a.title 

Это даст вам результат всех уникальных комбинаций advert.id и advert.title, вместе с количеством записей в advert_interest_records, которые связаны с значением advert.id.

Я предполагаю, что advert.id уникален и что каждый идентификатор встречается только один раз.В противном случае группировка как по id, так и по названию (которая, по-моему, не нужна для MySQL, в отличие от других СУБД), может привести к неправильным результатам.

+0

Извините, но не могли бы вы объяснить точку сгруппировки по двум полям, когда первый (id) должен быть уникальным? – raina77ow

+2

Как я уже сказал в своем ответе, я не думаю, что это необходимо для MySQL. Однако другие DBMS'ы дают ошибку при выборе полей, которые не входят в группировку групп. У меня нет непосредственного экземпляра MySQL, работающего здесь на работе; поэтому я выбрал самый безопасный маршрут :). – Yhn

+0

@Yhn: и вы хорошо поработали;) – DonCallisto

0
SELECT advert.id, advert.title, count(*) as totalRows 
FROM advert 
LEFT JOIN 
     advert_interest_record ON advert.id = advert_interest_record.advert_id 
GROUP BY advert.id, advert.title 

Некоторые заметки о запросе

  1. GROUP BY advert_interest_record.advert_id, который из исходного запроса. Вы group by поле, которое не входит в SELECT. Это вызывает ваш вопрос
  2. Некоторые СУБД требует, чтобы все group by поля, должны присутствовать также в SELECT те
+0

Если обе таблицы имеют столбец 'id', это получает nerfed. Кроме того, я не уверен, почему вы добавили 'id' в SELECT, когда' advert.id' уже существует. – MatBailie

+0

@Dems я не заметил, что это был предыдущий 'id', используемый в' SELECT' – DonCallisto

1

Как об этом:

SELECT a.title, COUNT(air.id) 
    FROM advert a 
LEFT JOIN advert_interest_record air 
     ON a.id = air.advert_id 
    GROUP BY a.id 

LEFT JOIN должны гарантировать, что все записи из таблица advert будет включена в окончательный результат.

1

Группа. С помощью advert.id вместо этого используйте count() для подсчета ваших записей.

В объявлениях, у которых нет объявления, необходимо вернуть значение count() равным нулю.

SELECT advert.id, count(advert_interest_record.id) as interestcount 
    FROM advert 
    LEFT JOIN advert_interest_record ON advert.id = advert_interest_record.advert_id 
GROUP BY advert.id; 
Смежные вопросы