Выберите данные из моих трех таблиц

0

У меня есть три стола, один из которых называется album, а другой - soundtrack и последний, но не менее важный, - это artist.

В одном альбоме более одного трека (очевидно) и имени исполнителя...

Так вот как это должно выглядеть:
Желаемый результат:

 |---------------------|
 |AlbumName by Charlie |
 |---------------------|
 | 1. See you again    |
 |---------------------|
 | 2. One call Away    |
 |---------------------|
 | Album by Ed Sheeran |
 |---------------------|
 | 1. Perfect          |
 |---------------------|
 | 2. Dive             |
 |---------------------|

И ниже - mysqli_fetch_array() который я использовал вместе с while-loop для заполнения <table>.

$query = "SELECT a.* AS Album, b.* AS Track, c.* AS Artist 
        FROM album a 
        INNER JOIN track b ON a.album_id=b.album_id 
        INNER JOIN artist c ON a.artist_id=c.artist_id 
        ORDER BY a.album_id ASC";

$result = mysqli_query($con, $query);
$c=0;
while($row = mysqli_fetch_assoc($result)) {
   $album = $row['Album']." (".$row['Artist'].") ";
   $track = $row['Track'];
}

Проблема в том, что когда я запускал этот код... я мог получить только этот результат...

|---------------------|
|AlbumName by Charlie |
|---------------------|
|  1. See you again   |
|---------------------|
|  2. One call away   |
|---------------------|
|  1. Perfect         |
|---------------------|
|  2.  Dive           |
|---------------------|

Он получил список саундтреков, в том числе саундтрек, однако, в Album Name не было ничего хорошего

Я хочу, чтобы это выглядело как " Желаемый результат". Есть идеи? Я попытался найти stackoverflow, но, похоже, он не мог направить меня на тот же вопрос, поэтому я сделал свой собственный. Пожалуйста, простите (не флагов) меня, если бы у него уже было существующее, а именно, что я не знал, где его найти. И pleeeeease... Мне нужен немедленный и рабочий ответ. Спасибо, парни!

Что касается структуры DATABASE

album = {album_id, artist_id,album_title}
artist = {artist_id, artist_name}
track = {song_id, album_id, song_title}

ОБНОВИТЬ!
Хорошо, так что это немного выходит из-под контроля. Когда я попробовал @swellar предложение, это произошло. И когда я его отменяю, выход остается неизменным. См. Результат ниже...

|---------------------|
|AlbumName by Charlie |
|---------------------|
|  1. See you again   |
|---------------------|
|AlbumName by Charlie |
|---------------------|
|  2. One Call Away   |
|---------------------|
|AlbumName by Charlie |
|---------------------|
|  1.  Perfect        |
|---------------------|
|AlbumName by Charlie |
|---------------------|
|  2.   Dive          |
|---------------------|

Я хочу дать каждому Album один или несколько звуковых дорожек, но он становится настолько запутанным каждый раз, когда я осмелюсь изменить query. Как я могу дезинфицировать mysqli_fetch_array() чтобы он отображал желаемый результат?

  • 0
    Просто альтернатива, почему бы не сделать два запроса? Один для получения album и artist , а другой для получения саундтреков. Пока первый запрос повторяется, выполните следующий запрос, где вы будете использовать album_id / artist_id или любой другой внешний ключ, чтобы получить все необходимые звуковые дорожки
  • 1
    Я немного очистил ваш код, но код на самом деле не создает никаких выходных данных.
Показать ещё 9 комментариев
Теги:

1 ответ

-4

Вот ваш SQL

Заметьте, я поставил там 3 порядка. Сначала имя исполнителя, в котором будут объединены все композиции исполнителя, затем по имени альбома, а затем по идентификатору песни.

$sql = "SELECT a.album_title AS Album,
               t.song_title AS Track,
               t.song_id AS ID,
               n.artist_name AS Artist
        FROM album AS a
            INNER JOIN track AS t
                ON a.album_id = t.album_id
            INNER JOIN artist AS n
                ON a.artist_id = n.artist_ID
        ORDER BY n.artist_name ASC,
                 a.album_id ASC,
                 t.song_id ASC";


/*
That SQL will generate the following array

Array
(
    [Album] => AlbumName
    [Track] => See you again
    [ID] => 1
    [Artist] => Charlie
)
Array
(
    [Album] => AlbumName
    [Track] => One call Away
    [ID] => 2
    [Artist] => Charlie
)
Array
(
    [Album] => Album
    [Track] => Perfect
    [ID] => 1
    [Artist] => Ed Sheeran
)
Array
(
    [Album] => Album
    [Track] => Dive
    [ID] => 2
    [Artist] => Ed Sheeran
)
*/

Ниже приведен цикл while

<table>
<?php
// Some placeholders
$album = null;

while($row = mysqli_fetch_assoc($result))
{
    if($row['Album'] !== $album)
    {
?>
    <tr>
        <td style="border: 1px solid #000000; background-color: #dedede;"><?php echo $row['Album']; ?> by <?php echo $row['Artist']; ?></td>
    </tr>
    <tr>
        <td style="border: 1px solid #000000;"><?php echo $row['ID']; ?>: <?php echo $row['Track']; ?></td>
    </tr>
<?php
    }
    else
    {
?>
    <tr>
        <td style="border: 1px solid #000000;"><?php echo $row['ID']; ?>: <?php echo $row['Track']; ?></td>
    </tr>
<?php
    }

   $album = $row['Album'];
}
?>
</table>

Общий результат:

<table>
    <tr>
        <td style="border: 1px solid #000000; background-color: #dedede;">AlbumName by Charlie</td>
    </tr>
    <tr>
        <td style="border: 1px solid #000000;">1: See you again</td>
    </tr>
    <tr>
        <td style="border: 1px solid #000000;">2: One call Away</td>
    </tr>
    <tr>
        <td style="border: 1px solid #000000; background-color: #dedede;">Album by Ed Sheeran</td>
    </tr>
    <tr>
        <td style="border: 1px solid #000000;">1: Perfect</td>
    </tr>
    <tr>
        <td style="border: 1px solid #000000;">2: Dive</td>
    </tr>
</table>

Есть лучшие способы обойти это, но не зная вашей рабочей среды, навыков, требований, другого кода, без труда, это лучшее быстрое и грязное решение для вашего решения. Это работает с тем, что вы просили.

  • 0
    Э-э ... У меня был существующий код, который почти такой же, как ваш, но не совсем. Потому что, как вы можете видеть в моем примере кода, я использовал для этого итерацию. Если вы видели $i=0 в верхней части моего образца, это то, что я имею в виду. Тем не менее, он не показывает каждое Album Name отдельности. Мол, название альбома Чарли постоянно всплывает даже на треке Эда. Я использовал LIMIT но он полностью игнорирует название альбома Эда
  • 0
    проблема не в объявлении <table> . Потому что вы просто вызовете <td><?php echo $var ?></td> Но мой случай совсем другой, потому что я хочу, чтобы он отображался в виде желаемого результата. Тем не менее, он продолжает повторять Album_Name Чарли. Пожалуйста, прочитайте весь мой пост. Причина, по которой ваш код работает, заключается в том, что он не вызывает значения из DB когда я нажимаю фрагмент кода запуска. Он вызывает значения, которые вы объявили в <table>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню