#mysql #sql #database
#mysql #sql #База данных
Вопрос:
У меня есть 2 таблицы:
mysql> describe solution_sections;
--------------------- --------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
--------------------- --------------- ------ ----- --------- ----------------
| solution_section_id | int(10) | NO | PRI | NULL | auto_increment |
| display_order | int(10) | NO | | NULL | |
| section_name | varchar(1000) | YES | | NULL | |
--------------------- --------------- ------ ----- --------- ----------------
3 rows in set (0.00 sec)
mysql> describe suggested_solution_comments;
----------------------- ---------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
----------------------- ---------------- ------ ----- --------- ----------------
| comment_id | int(10) | NO | PRI | NULL | auto_increment |
| problem_id | int(10) | NO | | NULL | |
| suggested_solution_id | int(10) | NO | | NULL | |
| commenter_id | int(10) | NO | | NULL | |
| comment | varchar(10000) | YES | | NULL | |
| solution_part | int(3) | NO | | NULL | |
| date | date | NO | | NULL | |
----------------------- ---------------- ------ ----- --------- ----------------
Что я пытаюсь сделать, так это отобразить список section_name из таблицы solution_sections. В нем всего около 10 строк. И для каждого имени раздела, чтобы получить список связанных с ним suggested_solution_comments.
Таблицы связаны с помощью suggested_solution_comments.solution_part и solution_sections.решение_section_id
Вот что я пытаюсь до сих пор:
select section_name , comment , solution_part , display_order from solution_sections
left join suggested_solution_comments on
solution_sections.solution_section_id = suggested_solution_comments.solution_part
where suggested_solution_id = 188
group by display_order;
Но это ничего не возвращает, когда нет комментариев. Но даже если комментариев нет, я бы хотел по-прежнему отображать список section_names из таблицы solution_sections.
Спасибо!!
Комментарии:
1. Если
solution_part
действительно есть ссылкаsolution_section_id
, он должен быть назван как таковой, использовать внешний ключ и иметь тот же тип и размер , что и исходный идентификатор. Почемуcomment
разрешено бытьnull
— разве эта таблица не предназначена для хранения комментариев? На что этоdate
ссылается — на дату решения, комментарий, Рождество, что? Если это такinsert_date
, подумайте о том, чтобы сделать этоtimestamp
. О, и … в настоящее время ваш запрос требует, чтобы комментарии были примерноsuggested_solution_id = 188
— попробуйте перенести это вON
предложение (или вообще исключить его).
Ответ №1:
Проблема здесь:
where suggested_solution_id = 188
Для вашего запроса требуется, чтобы suggested_solution_id имел значение 188, что никогда не будет верно для записей, у которых нет комментариев. Попробуйте добавить в это:
OR suggested_solution_id IS NULL
Комментарии:
1. к сожалению, добавление этого условия в
WHERE
предложение все равно приведет к тому, что оно будет равно false для записей, которые имеют комментарии, но не являются частью перечисленныхsuggested_solution_id
.2. @X-Zero Предположительно, автор знает это, иначе он не включил бы предложение WHERE в свой пример. Я предполагаю, что автор хотел совпадений,
suggested_solution_comments
если бы они существовали, но он хотел видетьsolution_sections
независимо от этого.
Ответ №2:
Используя suggested_solution_id
в клаузуле where, вы исключаете из результата любую строку, которая имеет нет содержимого в suggested_solution_comments
таблице нет совпадающей строки.
Если вы хотите получать результаты, даже когда suggested_solution_comments
нет содержимого, вы не можете использовать это поле в клаузуле where. или вы должны учитывать возможность того, что suggested_solution_id
может быть NULL.
ОТРЕДАКТИРОВАНО с учетом комментария @X-Zero
Комментарии:
1. Нет, он не удаляет строки, у которых нет содержимого, он удаляет строки, у которых нет соответствующего содержимого. Если он хочет комментарии из всех разделов, ему, вероятно, придется полностью исключить
WHERE
предложение.
Ответ №3:
Я думаю, что ваша структура таблицы не подходит для этого. если у вас есть только первичный ключ в каждой таблице, и вы хотите выполнить для них объединение, ему нужно будет ссылаться на то же самое.. В противном случае, ввод внешнего ключа, способного объединяться с первичным ключом в другой таблице.
Комментарии:
1. Как бы вы структурировали таблицу для этого? Вы правы. Я думаю, что структура таблицы является частью проблемы, но я не уверен, как ее улучшить.