SQL-запрос ничего не находит, но возвращает 1 строку со всеми нулями - PullRequest
2 голосов
/ 04 января 2012

У меня есть этот запрос:

select problems.problem_id , creator_member_id , problem_title , problem_description , sum( vote ) as totalVotes , DAYOFMONTH(problem_date) , DAYNAME(problem_date) , YEAR(problem_date) , MONTH(problem_date) , first_name , last_name , email , small_thumb , mid_thumb 
    from problems 
        left join problem_votes 
            on problems.problem_id = problem_votes.problem_id 
        left join users 
            on problems.creator_member_id = users.user_id 
        left join member_photo 
            on problems.creator_member_id = member_photo.member_id 
    where problems.problem_id = 1;

Ничего не соответствует и возвращает это:

-+--------------------+---------------------+------------+-----------+-------+-------------+-----------+
| problem_id | creator_member_id | problem_title | problem_description | totalVotes | DAYOFMONTH(problem_date) | DAYNAME(problem_date) | YEAR(problem_date) | MONTH(problem_date) | first_name | last_name | email | small_thumb | mid_thumb |
+------------+-------------------+---------------+---------------------+------------+--------------------------+-----------------------+--------------------+---------------------+------------+-----------+-------+-------------+-----------+
|       NULL |              NULL | NULL          | NULL                |       NULL |                     NULL | NULL                  |               NULL |                NULL | NULL       | NULL      | NULL  | NULL        | NULL      |
+------------+-------------------+---------------+---------------------+------------+--------------------------+-----------------------+--------------------+---------------------+------------+-----------+-------+-------------+-----------+

Но мне интересно, почему это вообще что-то возвращает? Что-то не так со схемой? Или запрос?

Я проверяю, возвращает ли он ничего, и пытаюсь вернуть страницу 404, но система считает, что есть 1 возвращенная строка, поэтому это сбивает с толку мое приложение.

Что-нибудь, что я могу сделать здесь не так?

Спасибо !!

Ответы [ 3 ]

3 голосов
/ 04 января 2012

Попробуйте добавить следующее предложение в конец вашего запроса:

GROUP BY problems.problem_id, creator_member_id, problem_title, 
problem_description, problem_date, first_name, last_name, 
email, small_thumb ,mid_thumb 

Рекомендуется, чтобы каждый столбец, выбранный, но не агрегированный (например, голосование), должен быть в предложении group by, хотя MYSQL этого не применяет. Вместо этого он ведет себя странно и смущает людей. (См. этот ответ для лучшего объяснения.)

3 голосов
/ 04 января 2012

Проблема связана с

sum( vote ) as totalVotes

Если вы хотите использовать агрегатные функции как SUM для группировки результирующего набора, вы должны использовать оператор как GROUP BY.

Иесли вы хотите отфильтровать этот результат, вы должны использовать HAVING

http://database -programmer.blogspot.com / 2008/04 / group-by-sum-avg-and-count.html

В вашем случае я думаю, что это должно работать:

SELECT problems.problem_id , creator_member_id , problem_title , problem_description , SUM( vote ) AS totalVotes , 
DAYOFMONTH(problem_date) , DAYNAME(problem_date) , YEAR(problem_date) , MONTH(problem_date) , first_name , last_name , email , small_thumb , mid_thumb 
FROM problems 
    LEFT JOIN problem_votes 
        ON problems.problem_id = problem_votes.problem_id 
    LEFT JOIN users 
        ON problems.creator_member_id = users.user_id 
    LEFT JOIN member_photo 
        ON problems.creator_member_id = member_photo.member_id
 WHERE problems.problem_id = 1; 
GROUP BY problems.problem_id , creator_member_id , problem_title , problem_description , problem_date , first_name , last_name , email , small_thumb , mid_thumb 
0 голосов
/ 04 января 2012

Во-первых, убедитесь, что у вас нет строки со всеми значениями NULL

Тогда: Ключевое слово LEFT JOIN возвращает все строки из левой таблицы (table_name1), даже если в правой таблице нет совпадений (table_name2).

Попробуйте изменить его на INNER JOIN

...