Вопрос про то, как с помощю одного запроса вывести содержимое ДВУХ таблиц, выводя из второй таблицы все содержимое, пока id второй таблицы, зависит-совпадает с id первой таблицы. (Сам не понял, что написал... хотя почему, все понял...). Объясню:
есть таблица `albums`
--------------------------
| id | album_name |
--------------------------
| 1 | Альбом_1 |
| 2 | Альбом_2 |
| ... | ... |
| n | Альбом_n |
--------------------------
есть таблица `songs`
---------------------------------------
| id | album_id | song_name |
---------------------------------------
| 1 | 1 | Песня_1 |
| 2 | 1 | Песня_2 |
| 3 | 1 | Песня_3 |
| 4 | 1 | Песня_4 |
| 5 | 1 | Песня_5 |
| 6 | 2 | Песня_1 |
| 7 | 2 | Песня_2 |
| 8 | 2 | Песня_3 |
| 9 | 2 | Песня_4 |
|10 | 2 | Песня_5 |
---------------------------------------
ну тут все понятно.
Так вот вывод надо такой: название альбома первого, все песни из первого альбома, название альбома второго, все песни из второго альбома и т.д.
Альбом_1:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Альбом_2:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Как это сделать ОДНИМ запросом? Научите пользоваться оператором JOIN!!!
Как не пробовал, не выводит как надо.
Двумя запросами - как два пальца... а вот с джоином никак...
Спустя 28 минут, 32 секунды (19.02.2007 - 12:44) cage написал(а):
почему join?
select album_name,song_name from albums,songs where album.id=songs.album_id
select album_name,song_name from albums,songs where album.id=songs.album_id
Спустя 28 минут, 59 секунд (19.02.2007 - 13:13) artuska написал(а):
Нет, так нельзя - цикл мне выведет все подряд.
Нужно так - сначало берется ID альбома_1 и название альбома_1 из таблицы `albums`, потом, из таблицы `songs` выводятся все песни этого альбома. И так далее - потом берется ID альбома_2 и название альбома_2 из таблицы `albums` и выводятся все песни этого альбома... Понимаешь, а не все подряд.
Если как ты говоришь сделать селект, то у меня не получится вывести ту структуру, которую я указал в первом посте - альбом, все песни, альбом, все песни...
Нужно так - сначало берется ID альбома_1 и название альбома_1 из таблицы `albums`, потом, из таблицы `songs` выводятся все песни этого альбома. И так далее - потом берется ID альбома_2 и название альбома_2 из таблицы `albums` и выводятся все песни этого альбома... Понимаешь, а не все подряд.
Если как ты говоришь сделать селект, то у меня не получится вывести ту структуру, которую я указал в первом посте - альбом, все песни, альбом, все песни...
Спустя 35 секунд (19.02.2007 - 13:14) Ghost написал(а):
select songs.*, albums.album_name from songs left join albums on albums.id=songs.album_id order by ...
Спустя 5 минут, 22 секунды (19.02.2007 - 13:19) cage написал(а):
ничего подобного,посмотри еще раз внимательно на sql запрос
Призрак,я по-моему написал то же самое
Призрак,я по-моему написал то же самое
Спустя 4 минуты, 46 секунд (19.02.2007 - 13:24) Ghost написал(а):
cage, извини, "songs" как-то мимо прошел. что было исправлено практически сразу, но ты успел увидеть :)
я пользуюсь join-ом, тк он для этого предназначен и не возникает путаницы между связками таблиц и условиями для отбора
я пользуюсь join-ом, тк он для этого предназначен и не возникает путаницы между связками таблиц и условиями для отбора
Спустя 4 минуты, 41 секунда (19.02.2007 - 13:28) artuska написал(а):
to ghost: попробую!
Вот запросы и вывод того, что требуется в начале темы:
Выводит так:
Альбом_1:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Альбом_2:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
to cage: твой запрос выведет перед каждой песней название альбома. Столько раз сколько песен.
Вывод бедет таким:
Альбом_1 - Песня_1
Альбом_1 - Песня_2
Альбом_1 - Песня_3
Альбом_1 - Песня_4
Альбом_1 - Песня_5
Понимаешь?
Вот запросы и вывод того, что требуется в начале темы:
PHP
$sqlquery = "SELECT * FROM `albums`"; { $sqlquery = "SELECT * FROM `songs` WHERE album_id='".$album->id."'"; $n='0'; { $n++; } echo "<br />"; }
Выводит так:
Альбом_1:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Альбом_2:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
to cage: твой запрос выведет перед каждой песней название альбома. Столько раз сколько песен.
PHP
$sqlquery = "SELECT album_name,song_name FROM `albums` a,`songs` s WHERE a.id=s.album_id"; { }
Вывод бедет таким:
Альбом_1 - Песня_1
Альбом_1 - Песня_2
Альбом_1 - Песня_3
Альбом_1 - Песня_4
Альбом_1 - Песня_5
Понимаешь?
Спустя 1 минута, 5 секунд (19.02.2007 - 13:29) cage написал(а):
artushka,щас норма?
Спустя 1 минута, 9 секунд (19.02.2007 - 13:31) artuska написал(а):
Нет, не норма. Твой запрос выводит не так, как надо!
Спустя 2 минуты, 15 секунд (19.02.2007 - 13:33) cage написал(а):
а ты как хочешь?напиши графически
Спустя 36 секунд (19.02.2007 - 13:33) artuska написал(а):
гы, у Призрака тоже самое как и у тя!!!
но все не правильно!
но все не правильно!
Спустя 46 секунд (19.02.2007 - 13:34) cage написал(а):
понял понял)))
Спустя 1 минута, 57 секунд (19.02.2007 - 13:36) artuska написал(а):
Графически? Непонял. Вывод должен быть таким:
Альбом_1:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Альбом_2:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Поинмаете?
У вас же вывод будет таким:
1. Альбом_1 - Песня_1
2. Альбом_1 - Песня_2
3. Альбом_1 - Песня_3
4. Альбом_1 - Песня_4
5. Альбом_1 - Песня_5
1. Альбом_2 - Песня_1
2. Альбом_2 - Песня_2
3. Альбом_2 - Песня_3
4. Альбом_2 - Песня_4
5. Альбом_2 - Песня_5
Мне надо, чтоб 1 раз выводилось название альбома после него все песни из этого альбома!!!
Альбом_1:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Альбом_2:
1. Песня_1
2. Песня_2
3. Песня_3
4. Песня_4
5. Песня_5
Поинмаете?
У вас же вывод будет таким:
1. Альбом_1 - Песня_1
2. Альбом_1 - Песня_2
3. Альбом_1 - Песня_3
4. Альбом_1 - Песня_4
5. Альбом_1 - Песня_5
1. Альбом_2 - Песня_1
2. Альбом_2 - Песня_2
3. Альбом_2 - Песня_3
4. Альбом_2 - Песня_4
5. Альбом_2 - Песня_5
Мне надо, чтоб 1 раз выводилось название альбома после него все песни из этого альбома!!!
Спустя 2 секунды (19.02.2007 - 13:36) cage написал(а):
я только не понял чем это вредит,для чего тебе нужна такая конструкция,если не надо каждый рах выводить название альбома,так не выводи
Спустя 1 минута, 7 секунд (19.02.2007 - 13:37) artuska написал(а):
В сообщении номер 7 я написал скрипт с двумя запросами и они выводят то, что надо.
Ну а как тогда мне вывести ОДИН раз, только ОДИН раз название альбома и потом МНОГО раз название всех песен?
Ну а как тогда мне вывести ОДИН раз, только ОДИН раз название альбома и потом МНОГО раз название всех песен?
Спустя 5 минут, 4 секунды (19.02.2007 - 13:42) cage написал(а):
это тебе уже надо придумать конструкция на php,которая выводит все это нужным тебе образом ,как ты уже понял здесь по-любому нужны 2 цикла,но я еще немного подумаю...
Спустя 3 минуты, 14 секунд (19.02.2007 - 13:46) artuska написал(а):
В том-то и дело, что походу можно и одним это запросом сделать с одним циклом.
Для чего тогда вообще придумали JOIN? Он это и должен делать...
Вообщем, вот ссылка, как это должно выглядить графически
http://placebo.yard.ru/?page=8&work=1
Видишь, там вывод названия альбома, потом название всех песен. Потом опять вывод названия другого альбома и все песни к нему...
Для чего тогда вообще придумали JOIN? Он это и должен делать...
Вообщем, вот ссылка, как это должно выглядить графически
http://placebo.yard.ru/?page=8&work=1
Видишь, там вывод названия альбома, потом название всех песен. Потом опять вывод названия другого альбома и все песни к нему...
Спустя 9 минут, 32 секунды (19.02.2007 - 13:55) Ghost написал(а):
естественно то же самое.
нужно делать одним запросом, но потом его соотв образом обрабатывать, а не просто выводить на экран результат
ставить исполнение запроса в цикл - очень плохой вариант, используется если нельзя никак иначе
на 5-м sql-е для аполучения того что ты хочешь можно использовать хранимые процедуры в принципе
нужно делать одним запросом, но потом его соотв образом обрабатывать, а не просто выводить на экран результат
ставить исполнение запроса в цикл - очень плохой вариант, используется если нельзя никак иначе
на 5-м sql-е для аполучения того что ты хочешь можно использовать хранимые процедуры в принципе
Спустя 1 минута, 40 секунд (19.02.2007 - 13:57) larin написал(а):
artuska
тебе cage дал правильный ответ
Только я бы написал через INNER JOIN или LEFT JOIN (что б выводить и альбомы без песен)
А ты начал дальше пургу писать, на кой четр делать 100...1000... запросов если все можно сделать одним. Ты получишь массив, а дальше работай с этим массивом.
А связывать таблицы при помощи циклов - это, простите, идиотизм.
тебе cage дал правильный ответ
Цитата
select album_name,song_name from albums,songs where album.id=songs.album_id
Только я бы написал через INNER JOIN или LEFT JOIN (что б выводить и альбомы без песен)
А ты начал дальше пургу писать, на кой четр делать 100...1000... запросов если все можно сделать одним. Ты получишь массив, а дальше работай с этим массивом.
А связывать таблицы при помощи циклов - это, простите, идиотизм.
Спустя 1 минута, 39 секунд (19.02.2007 - 13:58) cage написал(а):
artushka,ты не так понял join-он вообще не для этого создан ,почитай мануал,что такое джоин - это всего лишь объединение таблиц,левое объединение вытаскивает лишь то ,что есть в левой но нету его отношения в правой
Спустя 49 минут, 10 секунд (19.02.2007 - 14:48) osv написал(а):
Что то вроде этого:
PHP
$query = "SELECT albums.album_name, songs.song_name FROM albums JOIN songs ON (albums.id=songs.album_id) order by album_name, song_name"; $result[$row['album_name']][] = $row['song_name']; } foreach ($result as $album_name => $songs) { foreach ($songs as $song_name) { } echo '<br />'; }
Спустя 1 час, 25 секунд (19.02.2007 - 15:48) artuska написал(а):
Ура!!! Работает!!!
Спасибо!
Просто я думал что делаешь 1 запрос, и циклом while все тебе выводится! Гы.
Ладна, всем спасибо. OSV - тебе отдельно спасибо - скрипт работает, как нужно.
Возможно, тема может быть закрыта.
Спасибо!
Просто я думал что делаешь 1 запрос, и циклом while все тебе выводится! Гы.
Ладна, всем спасибо. OSV - тебе отдельно спасибо - скрипт работает, как нужно.
Возможно, тема может быть закрыта.
_____________