2012-05-29 4 views
0

У меня проблема.mysql query показывает 9 результатов

Я выполняю следующий запрос. У меня есть только одна запись в моей базе данных, но я получаю 9 результатов.

SELECT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46) 
    AND cv_cat.cvFK = c.id 

Может кто-нибудь, пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы с этим вопросом. Почему я получаю 9 результатов, а не только 1 результат.

Этот запрос должен отображать только одну запись, но показывает 9 результатов.

+0

Почему вы не можете сделать запрос 'JOIN', как обычно, люди его пишут? –

ответ

2

Когда вы

FROM cv AS c, employee AS e , cvCat AS cv_cat 

Вы делаете неявное объединение трех таблиц. Если вы хотите, чтобы получить различные записи, которые вы можете добавить DISTINCT после вашего выбора:

SELECT DISTINCT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46) 
    AND cv_cat.cvFK = c.id 
+0

будет делать запрос медленным – Lalajee

+0

Это не должно заставлять ваш запрос занимать гораздо больше времени, чем он есть. Если столбцы 'DISTINCT', которые вы выбираете, индексируются, mySQL сможет использовать этот индекс для возврата отдельных записей. Если столбцы не индексируются, mySQL создаст временную таблицу для вычисления отдельных записей. Если вы префикс вашего запроса с помощью 'EXPLAIN', вы можете проверить последний столбец с надписью« Экстра », и он скажет вам, будет ли он использовать индекс или временную таблицу для возврата отдельных результатов. –

+0

Я индексирую идентификатор. его мой первичный ключ. – Lalajee

2

Использование явно присоединяется:

SELECT c.id, c.rk 
FROM cv c 
INNER JOIN employee e ON e.id = c.empIDFK 
INNER JOIN cvCat cv_cat ON cv_cat.cvFK = c.id 
WHERE c.status = 1 
AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46) 
+0

это замедлит мой запрос вниз – Lalajee

+0

все еще показывает 9 результатов, я сделал chnages. – Lalajee

+0

@Lalajee Вам нужно будет следовать советам zi42 и добавить ключевое слово 'DISTINCT' после вашего' SELECT', если это так. Если ваши результаты раньше были 9 строк одних и тех же данных, добавление 'DISTINCT' будет выводить только одну строку. Не зная данных в ваших таблицах или точного вывода, количество советов, которые могут быть даны, ограничено. Что касается скорости, использование явных объединений должно фактически ускорить работу больше всего. – Crontab

1

Я думаю, что 9 результат строка «вопрос» основан на вашем JOIN синтаксис, как и такое неявное объединение вернет все строки (каждой таблицы) в качестве объединенного результата, так как вы только вытаскиваете c.id и c.rk, похоже, что MySQL отправил тот же результат обратно 9 раз.

Side Примечание: Неявное присоединяется в настоящее время не рекомендуется, используя явные соединения, такие как ...

SELECT c.id, c.rk 
    FROM cv c 
    LEFT JOIN employee e ON c.empIDFK = e.id 
    LEFT JOIN cvCat cv_cat ON c.id = cv_cat.cvFK 
    WHERE... 

Поможет «будущее-доказательство» ваш код немного и добавить немного больше уверенности, описывающее синтаксис весь запрос.

+0

В чем разница между левым или внутренним соединением. – Lalajee

+0

показывается 9 результатов – Lalajee