2011-06-21 2 views
-1
SELECT count(t1.id) , t2.special_value 
FROM table_1 AS t1, table_2 AS t2 
WHERE t1.`group` = 'val' 
AND t2.code = 'val' 

возвращаетMySQL проблемы подсчета

count - normal value 
special_value - NULL 

но

SELECT t2.special_value 
FROM table_2 AS t2 
WHERE t2.code = 'val' 

возвращает

special_value - another normal value 

почему первый запрос работает неправильно? ..

в настоящее время, мне нужно

(count(t1.id) + t2.special_value) 
+0

Как первый запрос возвращает 'special_value' в столбце A. И второй запрос возвращает 2 столбца? –

+3

Что это за «pp» и «p»? –

+0

Трудно сказать, что не так, не зная ничего о вашей схеме, но, похоже, вы не определили какую-либо связь между таблицами t1 и t2, в результате чего получилось перекрестное соединение. Кроме того, использование агрегатной функции (счет) без какой-либо GROUPing вызывает проблемы. –

ответ

2

Вот почему вы никогда не должны использовать SQL'89 неявный синтаксис объединения.

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

Перепишите запрос, используя Явные синтаксис:

SELECT count(t1.id) , t2.special_value 
FROM table_1 AS t1 
INNER JOIN table_2 AS t2 ON (t1.`group` = t2.code) <<-- join condition here 
WHERE ....           <<-- filter condition here 
GROUP BY ....           <<-- group by field here 

Я не знаю, как таблица t1 и t2 связаны между собой, так что вы должны настроить этот немного, но это, как он должен работать ,
И, пожалуйста, никогда не используйте неявный where снова присоединяется.

Замечания
Я интересно, что p.`group` и pp.code есть, но я предполагаю, что вы имели в виду, чтобы написать t1.`group` и t2.code

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

+0

@Johan: Это не только вы. Я бы остановил этот вопрос только для этого, если бы только я не достиг своего дневного лимита ... –

+0

t2.special_value возвращает NULL, если count (t1.id) = 0 – Zdomb

+0

@ Zdomb, только если вы используете 'left join 'не на внутреннем соединении. – Johan

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