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