Запрос не возвращает все строки, я думал, что это будет - PullRequest
1 голос
/ 09 декабря 2011

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

SELECT category_name, categories.category_id, problems.problem_id, COUNT(problems.problem_id) as num_problems
FROM categories 
JOIN problem_categories 
ON problem_categories.category_id = categories.category_id
JOIN problems 
ON problems.problem_id = problem_categories.category_id
WHERE is_top = 1
GROUP BY category_name, categories.category_id, problems.problem_id;

Возвращает 2 строки. Но есть около 9 элементов, которые соответствуют предложению is_top = 1. Я не уверен, почему они также не возвращаются?

Вот что в настоящее время возвращается:

+---------------+------------+--------------+
| category_name | problem_id | num_problems |
+---------------+------------+--------------+
| Entertainment |         46 |            1 |
| Home          |         49 |            2 |
+---------------+------------+--------------+
2 rows in set (0.00 sec)

Вот мои таблицы:

mysql> describe categories;
+----------------------+---------------+------+-----+---------+----------------+
| Field                | Type          | Null | Key | Default | Extra          |
+----------------------+---------------+------+-----+---------+----------------+
| category_id          | int(10)       | NO   | PRI | NULL    | auto_increment |
| creator_id           | int(10)       | NO   |     | NULL    |                |
| category_name        | varchar(100)  | NO   | UNI | NULL    |                |
| category_description | varchar(5000) | YES  |     | NULL    |                |
| category_date        | date          | NO   |     | NULL    |                |
| is_top               | tinyint(1)    | YES  |     | NULL    |                |
| problem_count        | int(8)        | YES  |     | NULL    |                |
+----------------------+---------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

mysql> describe problem_categories;
+---------------------+---------+------+-----+---------+----------------+
| Field               | Type    | Null | Key | Default | Extra          |
+---------------------+---------+------+-----+---------+----------------+
| problem_category_id | int(10) | NO   | PRI | NULL    | auto_increment |
| problem_id          | int(10) | NO   | MUL | NULL    |                |
| creator_id          | int(10) | NO   |     | NULL    |                |
| category_id         | int(10) | NO   |     | NULL    |                |
| category_date       | date    | NO   |     | NULL    |                |
+---------------------+---------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> describe problems;
+---------------------+---------------+------+-----+---------+----------------+
| Field               | Type          | Null | Key | Default | Extra          |
+---------------------+---------------+------+-----+---------+----------------+
| problem_id          | int(10)       | NO   | PRI | NULL    | auto_increment |
| creator_member_id   | int(10)       | NO   |     | NULL    |                |
| problem_title       | varchar(100)  | NO   |     | NULL    |                |
| problem_description | varchar(3000) | YES  |     | NULL    |                |
| problem_date        | date          | NO   |     | NULL    |                |
| upvotes             | int(7)        | YES  |     | NULL    |                |
| downvotes           | int(7)        | YES  |     | NULL    |                |
| date_updated        | date          | YES  |     | NULL    |                |
+---------------------+---------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

Есть идеи, почему другие высшие категории не возвращаются с их количеством?

Спасибо !!

Между прочим, значения для двух возвращаемых категорий верны.

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Условие соединения problems.problem_id = problem_categories.category_id выглядит неверно.

Предположительно, это должно быть problems.problem_id = problem_categories.problem_id.

Вы также можете рассмотреть возможность LEFT JOIN, чтобы вернуть количество категорий без проблем.

1 голос
/ 09 декабря 2011

Поскольку вы выполняете два внутренних соединения с двумя другими таблицами, у которых может не быть соответствующей строки.

1 голос
/ 09 декабря 2011

Без просмотра ваших данных довольно сложно сказать, но я бы порекомендовал изменить Внутренние СОЕДИНЕНИЯ на ЛЕВЫЕ соединения

например.

SELECT category_name, categories.category_id, problems.problem_id, COUNT(problems.problem_id) as num_problems
FROM categories 
LEFT JOIN problem_categories 
ON problem_categories.category_id = categories.category_id
LEFT JOIN problems 
ON problems.problem_id = problem_categories.category_id
WHERE is_top = 1
GROUP BY category_name, categories.category_id, problems.problem_id;

Поскольку у вас есть проблема с определенным идентификатором проблемы, я обычно пишу инструкцию SQL, чтобы помочь отладить ее, выполнив что-то вроде

SELECT is_top , category_name, categories.category_id, problems.problem_id
FROM 
       problems
       LEFT JOIN problem_categories 
        ON problems.problem_id = problem_categories.category_id
       LEFT JOIN categories 
      ON problem_categories.category_id = categories.category_id

WHERE  problems.problem_id = 1234 --Whatever the ID is that you think should be showing up

Это поможет определить, является ли is_top действительно верным, а также определить и любые предположения, которые я сделал в отношении JOINS (например, нулевые значения в объединенных полях)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...