Как выбрать данные из одной таблицы и получить все связанные записи из другой таблицы?

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

Сценарий таков:

У меня есть две таблицы, а именно: tbl_instructors, в которой есть информация об инструкторах, такая как идентификатор и имя инструктора, и tbl_advisory, в которой есть все записи класса, который обрабатывается конкретным инструктором, например Course, Year и Section класса. Итак, моя таблица выглядит примерно так:

таблица_инструктор:

id  | name
----+--------------
001 | Jhon Doe
002 | Kaitlyn Moore  

tbl_advisory:

instructor_id  | course        | year      |  section
---------------+---------------+-----------+-----------
001            | BSINT         | 2nd Year  | A
001            | BSINT         | 2nd Year  | C
001            | BSINT         | 2nd Year  | B
002            | BSBA          | 1st Year  | A
002            | BSBA          | 1st Year  | D

Теперь я пытаюсь выбрать идентификатор и имя инструктора и связанную с ним консультативную информацию, используя INNER JOIN в моем PHP-запросе:

<?php
$getAdvisory = "SELECT 
  ti.id AS id,
  ti.name AS name,
  ta.course AS ccourse,
  ta.year AS cyear,
  ta.section AS csection
FROM tbl_instructor as ti
INNER JOIN tbl_advisory as ta
ON ti.id = ta.instructor_id";
OpenConn()->query($getAdvisory);

if ($getAdvisory->num_rows > 0) {
    while ($row = $getAdvisory->fetch_assoc()) {
     $id = $row['id'];
     $name = $row['name'];
    }
    ?>
    <td><?php echo $id; ?></td>
    <td><?php echo $name; ?></td>
    <td><button>View Advisory</button></td>
    <?php
 }
}
?>

Что дает мне набор результатов в моей таблице html/php:

id   | name          |  action
-----+---------------+-----------
001  | John Doe      | View Advisory
001  | John Doe      | View Advisory
001  | John Doe      | View Advisory
002  | Kaitlyn Moore | View Advisory
002  | Kaitlyn Moore | View Advisory

Моя проблема в том, что я хочу, чтобы моя html-таблица была DISTINCT по идентификатору инструктора, но по-прежнему возвращала всю связанную консультативную информацию каждого инструктора, потому что я хочу отображать, какой класс инструктор проводит в модальном режиме, когда я нажимаю кнопку View Advisory рядом с каждым инструктором. Имя Чтобы я мог обновить свою таблицу, если инструктор удалил или добавил новый совет.

Как я могу достичь этого? Заранее спасибо.

пытался Group By?

Masivuye Cokile 22.02.2019 14:20

Это родительская страница, используйте группу там. при щелчке по просмотру рекомендации передайте идентификатор инструктора, чтобы получить соответствующие рекомендации из таблицы tbl_advisory.

Rahul 22.02.2019 14:22

@MasivuyeCokile Да, я сделал. Но он возвращает только 1 строку для справочной информации.

jreloz 22.02.2019 14:24

см. комментарий @RahulMeshram выше ^

Masivuye Cokile 22.02.2019 14:27

Можете ли вы построить тестовую схему здесь ссылка на сайт?

Rahul 22.02.2019 14:29

@RahulMeshram, когда я нажимаю кнопку «Просмотреть рекомендации», появляется модальное окно и отображается информационная информация. . Что ты хочешь этим сказать ?

jreloz 22.02.2019 14:30

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

Rahul 22.02.2019 14:32

@RahulMeshram, можете ли вы опубликовать свой ответ ниже, сэр?

jreloz 22.02.2019 14:35

Проверьте мой ответ. Дайте мне знать, если что-то не ясно

Rahul 22.02.2019 14:49

Кажется, вы хотите преобразовать двумерный массив в многомерный.

Strawberry 22.02.2019 14:54

Почему вы не печатаете информацию из tbl_advisory? Какой смысл выбирать эти столбцы, если вы их не используете?

Barmar 26.02.2019 18:27

@Barmar, пожалуйста, внимательно прочитайте мой вопрос. .

jreloz 09.03.2019 10:05

Выполните группировку по инструктору в коде PHP вместо SQL. Когда вы получаете результаты, создайте ассоциативный массив с ключом по идентификатору инструктора, а значением будет массив данных из tbl_advisory.

Barmar 09.03.2019 19:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
13
129
2

Ответы 2

Вам нужно предложение DISTINCT

 SELECT DISTINCT 
  ti.id AS id,
  ti.name AS name,
  ta.course AS ccourse,
  ta.year AS cyear,
  ta.section AS csection
FROM tbl_instructor as ti
INNER JOIN tbl_advisory as ta ON ti.id = ta.instructor_id

Таким образом вы должны получить

id   | name          |  action
-----+---------------+-----------
001  | John Doe      | View Advisory
002  | Kaitlyn Moore | View Advisory

Если значение находится в разных строках, вы можете использовать (поддельную) функцию агрегации.

SELECT ti.id AS id,
ti.name AS name,
min(ta.course) AS ccourse,
min(ta.year) AS cyear,
min(ta.section)  AS csection
FROM tbl_instructor as ti
INNER JOIN tbl_advisory as ta ON ti.id = ta.instructor_id
GROUP BY id, name 

Это не приведет к такому результату, поскольку course, year и section будут разными в каждой строке.

Barmar 26.02.2019 18:28

Как я спросил в комментарии к основному вопросу, какой смысл выбирать что-либо из tbl_advisory в этом запросе, если оно не отображается?

Barmar 26.02.2019 18:33

Пожалуйста, проверьте этот запрос:

SELECT    ti.*, GROUP_CONCAT( CONCAT( ta.course, ' ' , ta.year,' ', ta.section ) separator ' - ') as ColumnName 
FROM tbl_instructor as ti
INNER JOIN tbl_advisory as ta ON ti.id = ta.instructor_id 
GROUP BY ti.idid  

Вывод:

      | name          |  action
 -----+---------------+-----------
 001  | John Doe      | BSINT 2nd Year a - BSINT 2nd Year b - BSINT 2nd Year c
 002  | Kaitlyn Moore | BSBA 1st Year d - BSBA 1st Year a

Спасибо за это, но я хочу назначить курс, год и раздел в переменную PHP, чтобы я мог обновлять базу данных, когда инструктор добавляет или удаляет рекомендательный файл . Возможно ли это с этим запросом?

jreloz 22.02.2019 14:44

Вы можете использовать explode(',', $row['ColumnName']), чтобы преобразовать столбец в массив всех рекомендаций.

Barmar 09.03.2019 19:40

Другие вопросы по теме