Как объединить таблицы, чтобы каждый элемент в одной из них отображался независимо от объединенной таблицы

#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. Как бы вы структурировали таблицу для этого? Вы правы. Я думаю, что структура таблицы является частью проблемы, но я не уверен, как ее улучшить.