[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оператор JOIN
artuska
Здрасти!
Вопрос про то, как с помощю одного запроса вывести содержимое ДВУХ таблиц, выводя из второй таблицы все содержимое, пока 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

Спустя 28 минут, 59 секунд (19.02.2007 - 13:13) artuska написал(а):
Нет, так нельзя - цикл мне выведет все подряд.
Нужно так - сначало берется 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-ом, тк он для этого предназначен и не возникает путаницы между связками таблиц и условиями для отбора

Спустя 4 минуты, 41 секунда (19.02.2007 - 13:28) artuska написал(а):
to ghost: попробую!

Вот запросы и вывод того, что требуется в начале темы:

PHP
  1.  
  2. $sqlquery = "SELECT * FROM `albums`";
  3. $result = mysql_query($sqlquery,$con);
  4.  
  5. while($album=mysql_fetch_object($result))
  6. {
  7. echo $album->album_name."<br />";
  8.  
  9. $sqlquery = "SELECT * FROM `songs` WHERE album_id='".$album->id."'";
  10. $rezult = mysql_query($sqlquery,$con);
  11.  
  12. $n='0';
  13. while($song=mysql_fetch_object($rezult))
  14. {
  15. $n++;
  16. echo $n.". ".$song->song_name."<br />";
  17. }
  18.  
  19. echo "<br />";
  20. }
  21.  




Выводит так:

Альбом_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
  1.  
  2. $sqlquery = "SELECT album_name,song_name FROM `albums` a,`songs` s WHERE a.id=s.album_id";
  3. $result = mysql_query($sqlquery,$con);
  4.  
  5. while($row=mysql_fetch_object($result))
  6. {
  7. echo $row->album_name." - ".$row->song_name."<br />";
  8. }
  9.  


Вывод бедет таким:

Альбом_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 раз выводилось название альбома после него все песни из этого альбома!!!

Спустя 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

Видишь, там вывод названия альбома, потом название всех песен. Потом опять вывод названия другого альбома и все песни к нему...

Спустя 9 минут, 32 секунды (19.02.2007 - 13:55) Ghost написал(а):
естественно то же самое.

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

на 5-м sql-е для аполучения того что ты хочешь можно использовать хранимые процедуры в принципе

Спустя 1 минута, 40 секунд (19.02.2007 - 13:57) larin написал(а):
artuska
тебе 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
  1.  
  2. $query = "SELECT albums.album_name, songs.song_name FROM albums JOIN songs ON (albums.id=songs.album_id) order by album_name, song_name";
  3. $data = mysql_query($query) or die("Query failed : " . mysql_error());
  4. while($row = mysql_fetch_assoc($data)){
  5. $result[$row['album_name']][] = $row['song_name'];
  6. }
  7. foreach ($result as $album_name => $songs) {
  8. echo '<b>'.$album_name.'</b><br />';
  9. foreach ($songs as $song_name) {
  10. echo ''.$song_name.'<br />';
  11. }
  12. echo '<br />';
  13. }
  14.  

Спустя 1 час, 25 секунд (19.02.2007 - 15:48) artuska написал(а):
Ура!!! Работает!!!
Спасибо!

Просто я думал что делаешь 1 запрос, и циклом while все тебе выводится! Гы.

Ладна, всем спасибо. OSV - тебе отдельно спасибо - скрипт работает, как нужно.

Возможно, тема может быть закрыта.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.