2013-08-08 2 views
2

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

Запрос выполняется из двух таблиц. Обе таблицы содержат данные, но мне нужно только подсчет (*) из второй таблицы.

SELECT m.*, (SELECT COUNT(*) FROM cd_members_offers WHERE mo.mo_member_id = m.m_id) as mo_count 
FROM cd_members m, cd_members_offers mo 
/* these are variables and don't always exist */ 
WHERE (m.m_fname LIKE '%Richie%' OR m.m_lname LIKE '%Richie%' OR m.m_email LIKE '%Richie%') 
AND (m.m_signupdate >= 20130807 AND m.m_signupdate <= 20130810) 
AND m.m_add_state = 'QLD' 
AND (mo_count >= '2' AND mo_count <= '5') 
/* this is the end of the variables */ 
AND mo.mo_member_id = m.m_id 
ORDER BY m.m_id ASC 

// quotes */на самом деле нет в коде. Я просто хотел показать, как запрос может потенциально выглядеть, если все переменные введены.

У меня возникла проблема сначала, когда появилось много дубликатов. Я также вполне уверен, что mo_count> = не правильный способ сделать это.

Я все еще играю с кодом и делаю еще больше исследований, но если кто-то сможет сэкономить несколько часов, я бы очень признателен.

ответ

0

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

SELECT m.*, COUNT(mo_member_id) mo_count 
    FROM cd_members m LEFT JOIN cd_members_offers mo 
    ON mo.mo_member_id = m.m_id 
WHERE (m.m_fname LIKE '%Richie%' OR m.m_lname LIKE '%Richie%' OR m.m_email LIKE '%Richie%') 
    AND m.m_signupdate >= '2013-08-07' AND m.m_signupdate <= '2013-08-10' 
    AND m.m_add_state = 'QLD' 
GROUP BY m.m_id 
HAVING mo_count BETWEEN 0 AND 5 

Образец продукции:

 
| M_ID | M_FNAME | M_LNAME |   M_EMAIL |     M_SIGNUPDATE | M_ADD_STATE | MO_COUNT | 
-------------------------------------------------------------------------------------------------------- 
| 1 | Richie | Richie | [email protected] | August, 08 2013 00:00:00+0000 |   QLD |  3 | 
| 2 | Richie2 | Richie2 | [email protected] | August, 09 2013 00:00:00+0000 |   QLD |  0 | 

Вот SQLFiddle демо

+0

Спасибо, Петер, ваш ответ был очень быстрым. Это работает достаточно хорошо, если пользователи не имеют 0 mo_count, они не отображаются в таблице. Я никогда раньше не использовал предложение «HAVING», поэтому я очень новичок в этом отношении. Приветствую вас за помощь Петер, это очень ценно. – user2663289

+0

@ user2663289 См. Обновленный ответ и sqlfiddle – peterm

+0

Иногда мне нужно использовать mo_count, даже когда мне нужно отображать пользователей со счетом 0. Например AND '(mo_count> = '0' AND mo_count <= '2')' Вы все еще используете предложение HAVING? – user2663289

0

Попробуйте

 SELECT m.*, (SELECT COUNT(*) FROM cd_members_offers mo WHERE mo.mo_member_id = m.m_id) as mo_count 
     FROM cd_members m 
     /* these are variables and don't always exist */ 
     WHERE (m.m_fname LIKE '%Richie%' OR m.m_lname LIKE '%Richie%' OR m.m_email LIKE '%Richie%') 
     AND (m.m_signupdate >= 20130807 AND m.m_signupdate <= 20130810) 
     AND m.m_add_state = 'QLD' 
     AND (mo_count >= '2' AND mo_count <= '5') 
     /* this is the end of the variables */ 
     ORDER BY m.m_id ASC 

Или можно использовать группы By с наличием пункт

 SELECT m.m_id, count(mo.mo_member_id) 
     FROM cd_members m,cd_members_offers mo 
     /* these are variables and don't always exist */ 
     WHERE (m.m_fname LIKE '%Richie%' OR m.m_lname LIKE '%Richie%' OR m.m_email LIKE '%Richie%') 
     AND (m.m_signupdate >= 20130807 AND m.m_signupdate <= 20130810) 
     AND m.m_add_state = 'QLD' 
     /* this is the end of the variables */ 
     AND mo.mo_member_id = m.m_id 
     Group by m.m_id 
     having count(mo.mo_member_id) between 2 and 5 
     ORDER BY m.m_id ASC 
+0

Спасибо Sandeep, мне очень нравится метод в вашей первой. Остальная проблема - mo_count: И (mo_count> = '2' И mo_count <= '5') Все работает отдельно от этой части sql. Если я оставлю эту строку пустой, запрос будет работать отлично. Спасибо за ваш супер быстрый ответ mate – user2663289

+0

Вы сталкиваетесь с какой-либо проблемой с пунктом GroupBy? В противном случае для первого запроса вам нужно написать внешний запрос в calcualte условие '(mo_count> = '2' AND mo_count <= '5')' –

+0

Большое спасибо Sandeep. Вы и Петртер помогли мне более чем достаточно. Я сейчас нахожусь там, где мне придется потратить какое-то время, чтобы прикоснуться к нему, чтобы это было правильно для меня. Я очень ценю это человек! Спасибо :) – user2663289

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