2015-03-23 4 views
-1

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

У меня есть данные в 6 таблицах, и вам нужно получить список всех городов из каждой таблицы и количество записей для каждого города вместе с ним.

Мой текущий запрос:

(SELECT res.CITY FROM rets_property_res res) 
UNION ALL 
(SELECT rnt.CITY FROM rets_property_rnt rnt) 
UNION ALL 
(SELECT lnd.CITY FROM rets_property_lnd lnd) 
UNION ALL 
(SELECT hir.CITY FROM rets_property_hir hir) 
UNION ALL 
(SELECT cnd.CITY FROM rets_property_cnd cnd) 
UNION ALL 
(SELECT mul.CITY FROM rets_property_mul mul) 
ORDER BY CITY ASC 

Я пробовал много усилий, чтобы добавить количество, но не могу получить синтаксис правильным, поскольку я не настолько велик, с синтаксисом MYSQL.

+0

Не уверен, что я понимаю, о чем вы спрашиваете ... некоторые примеры данных могут помочь проиллюстрировать вашу проблему. Тем не менее, моя кишка уже кричит, что (из поверхностной информации, которую вы показали до сих пор) эта схема, похоже, нарушает [принцип ортогонального дизайна] (http://en.wikipedia.org/wiki/Principle_of_orthogonal_design). – eggyal

+0

Пожалуйста, не помещайте код в длинную горизонтальную линию: его очень трудно прочитать. – user4035

+0

Вы хотите, чтобы подсчет ВСЕХ записей для каждого города или вы хотите подсчет каждого города в каждом столе? Другими словами, если у вас есть 2 вхождения «Smallville» в 1 таблице и 3 вхождения в другую таблицу, вы хотите, чтобы она сообщала 2 и 3 или вы хотите, чтобы она сообщала 5? –

ответ

0

Если поместить весь свой запрос в подзапрос, то вы можете рассчитать свой COUNT() от этих результатов:

SELECT CITY, COUNT(*) 
FROM (
    (SELECT res.CITY FROM rets_property_res res) 
    UNION ALL 
    (SELECT rnt.CITY FROM rets_property_rnt rnt) 
    UNION ALL 
    (SELECT lnd.CITY FROM rets_property_lnd lnd) 
    UNION ALL 
    (SELECT hir.CITY FROM rets_property_hir hir) 
    UNION ALL 
    (SELECT cnd.CITY FROM rets_property_cnd cnd) 
    UNION ALL 
    (SELECT mul.CITY FROM rets_property_mul mul) 
) 
GROUP BY CITY 
+0

Зачем нужно это делать? Пожалуйста, добавьте объяснение того, что вы сделали, и почему вы сделали это таким образом не только для OP, но и для будущих посетителей SO. –

2

(I). Когда вам нужно количество строк на основе поля или полей, вы можете использовать Group by в этом поле (и).

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

При этом вы будете иметь количество городов каждой таблицы

SELECT count(*) AS CNT, CITY, tName 
FROM (
    SELECT res.CITY ,'res' as tName 
    FROM rets_property_res res 
    UNION ALL 
    SELECT rnt.CITY,'rnt' as tName 
    FROM rets_property_rnt rnt 
    UNION ALL 
    SELECT lnd.CITY,'lnd' as tName 
    FROM rets_property_lnd lnd 
    UNION ALL 
    SELECT hir.CITY,'hir' as tName 
    FROM rets_property_hir hir 
    UNION ALL 
    SELECT cnd.CITY,'cnd' as tName 
    FROM rets_property_cnd cnd 
    UNION ALL 
    SELECT mul.CITY,'mul' as tName 
    FROM rets_property_mul mul 
    ) as DT 
Group by tName, CITY 
ORDER BY CITY ASC 
+0

Я хочу выбрать это как ответ, однако он не возвращал название города. Я изменил первую строку на SELECT count (*) AS CNT, CITY, tName – webfish

+0

@webfish, если вы хотите 'CITY' в' Select', вы также должны добавить его в 'Group By'. –

0

Попробуйте, это даст вам количество каждого города из каждой таблицы

(SELECT res.CITY, resDup.res_count FROM rets_property_res res 
     JOIN (SELECT COUNT(CITY) res_count FROM rets_property_res GROUP BY CITY) resDup ON `resDup`.`CITY` = `res`.`CITY` 
    ) 
    UNION ALL 
    (SELECT rnt.CITY, rntDup.rnt_count FROM rets_property_rnt rnt 
     JOIN (SELECT COUNT(CITY) rnt_count FROM rets_property_rnt GROUP BY CITY) rntDup ON `rntDup`.`CITY` = `rnt`.`CITY` 
    ) 
    UNION ALL 
    (SELECT lnd.CITY, lndDup.lnd_count FROM rets_property_lnd lnd 
     JOIN (SELECT COUNT(CITY) lnd_count FROM rets_property_lnd GROUP BY CITY) lndDup ON `lndDup`.`CITY` = `lnd`.`CITY` 
    ) 
    UNION ALL 
    (SELECT hir.CITY, hirDup.hir_count FROM rets_property_hir hir 
     JOIN (SELECT COUNT(CITY) hir_count FROM rets_property_hir GROUP BY CITY) hirDup ON `hirDup`.`CITY` = `hir`.`CITY` 
    ) 
    UNION ALL 
    (SELECT cnd.CITY, cndDup.cnd_count FROM rets_property_cnd cnd 
     JOIN (SELECT COUNT(CITY) cnd_count FROM rets_property_cnd GROUP BY CITY) cndDup ON `cndDup`.`CITY` = `cnd`.`CITY` 
    ) 
    UNION ALL 
    (SELECT mul.CITY, mulDup.mul_count FROM rets_property_mul mul 
     JOIN (SELECT COUNT(CITY) mul_count FROM rets_property_mul GROUP BY CITY) mulDup ON `mulDup`.`CITY` = `mul`.`CITY` 
    ) 
    ORDER BY CITY ASC 

Позвольте мне знать, если есть какие-либо проблемы

+0

Зачем OP «попробуйте это»? Пожалуйста, добавьте объяснение того, что вы сделали, и почему вы сделали это таким образом не только для OP, но и для будущих посетителей SO. –

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