Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите составить запрос с объединением
 
 автор: lutsk   (18.01.2013 в 00:11)   письмо автору
 
 

Есть таблица "suggestions":

-------------------------------------
suggestion_id | name | project_author
-------------------------------------
1 | aaa | Vasya
-------------------------------------
2 | ccc | petya
-------------------------------------
3 | bbb | Vasya
---------- --------------------------
4 | eee | Vasya
-------------------------------------
5 | ddd | petya
-------------------------------------

и есть таблица "files":

------------------------------
id_file | file_name | suggestion
------------------------------
1 | aaaaa.jpg | 3
------------------------------
2 | bbbbb.jpg | 2
------------------------------
3 | ccccc.jpg | 1
------------------------------
4 | ddddd.jpg | 2
------------------------------
5 | eeeee.jpg | 4
------------------------------
6 | ggggg.jpg | 3
------------------------------
7 | kkkkk.jpg | 5
------------------------------
8 | mmmь.jpg | 2
------------------------------
9 | ooooo.jpg | 1
------------------------------
10 | ppppp.jpg | 4
------------------------------

Как составить запрос, чтоб в итоге получилась структура массива:

Vasya_files = array(
[0] => aaa = array(
[0] => ccccc.jpg
[1] => ooooo.jpg
)
[1] => bbb = array(
[0] => aaaaa.jpg
[1] => ggggg.jpg
)
[2] => eee = array(
[0] => eeeee.jpg
[1] => ppppp.jpg
)
)

Другими словами, вытащить все "file_name", принадлежащие "suggestions", которые в свою очередь пренадлежат "Vasya"?

  Ответить  
 
 автор: Sfinks   (18.01.2013 в 00:24)   письмо автору
 
   для: lutsk   (18.01.2013 в 00:11)
 

SELECT name, file_name
FROM suggestions
JOIN files ON suggestion=suggestion_id
WHERE project_author='Vasya'
ORDER BY suggestion_id

Этот запрос вернет вам записи:
aaa | ccccc.jpg
aaa | ooooo.jpg
bbb | aaaaa.jpg
bbb | ggggg.jpg
eee | eeeee.jpg
eee | ppppp.jpg
из которых вы уже можете в PHP сформировать массив в требуемом виде.

  Ответить  
 
 автор: oradev   (18.01.2013 в 08:27)   письмо автору
 
   для: Sfinks   (18.01.2013 в 00:24)
 

Sfinks, ваш запрос не верен, а если записи, соответствующей id записи Васи в таблице files не будет?
Не надо забывать про левое соединение.

  Ответить  
 
 автор: Sfinks   (18.01.2013 в 09:14)   письмо автору
 
   для: oradev   (18.01.2013 в 08:27)
 

Возможно. Зависит от структуры базы. Может быть и JOIN и LEFT JOIN. Автор этого не оговорил.

  Ответить  
 
 автор: oradev   (18.01.2013 в 09:29)   письмо автору
 
   для: Sfinks   (18.01.2013 в 09:14)
 

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

  Ответить  
 
 автор: Sfinks   (18.01.2013 в 13:40)   письмо автору
 
   для: oradev   (18.01.2013 в 09:29)
 

У вас самоцель со мной поспорить чтоли?

Я говорю о том, что если ВАШ пример НЕ ВОЗМОЖЕН по логике данных (а такие примеры сплошь и рядом), то и LEFT не нужен.

Кроме того, ЧИТАЙТЕ УСЛОВИЕ!
> вытащить все "file_name", принадлежащие "suggestions"
В первую очередь нужны файлы, а не suggestions с файлами или без них.

Поэтому JOIN, JEFT JOIN, RIGHT JOIN, CROSS JOIN нужно использовать там где это надо, а не везде где не попадя.

  Ответить  
 
 автор: oradev   (18.01.2013 в 14:26)   письмо автору
 
   для: Sfinks   (18.01.2013 в 13:40)
 

Да кто вам сказал, что его надо применять везде не попадя - вы придумываете опять что-то, ею Богу, я такого не говорил, лишь привел что будет с вашим запросом без LEFT.

Зачем же обрывать вопрос, я только не понимаю

все "file_name", принадлежащие "suggestions", которые в свою очередь пренадлежат "Vasya"

Васи нет в files и все приехали, но есть в suggestions.

Спорить с вами, да куда там.

  Ответить  
 
 автор: lutsk   (18.01.2013 в 10:30)   письмо автору
 
   для: Sfinks   (18.01.2013 в 00:24)
 

Такой запрос я уже пробовал. На уровне базы данных вроде древовидной структуры не реализовать. Значит придется двойным foreach с запросом к базе при каждой итерации обходиться..

  Ответить  
 
 автор: oradev   (18.01.2013 в 10:38)   письмо автору
 
   для: lutsk   (18.01.2013 в 10:30)
 

Автор, а что вы хотите получить на выходе ?
Развернутое дерево ?

Гораздо лучше предварительно загрузить данные в массив из базы, ключом будет родитель, а элементами например объект - соответствующей вашей каждой строке из базы.

А получить дерево одним запросом можно, например предварительно отсоритовав дерево.

  Ответить  
 
 автор: lutsk   (18.01.2013 в 13:09)   письмо автору
 
   для: oradev   (18.01.2013 в 10:38)
 

Так видимо и сделаю.

  Ответить  
 
 автор: Valick   (18.01.2013 в 11:09)   письмо автору
 
   для: lutsk   (18.01.2013 в 10:30)
 

http://www.internet-technologies.ru/articles/article_635.html

  Ответить  
 
 автор: lutsk   (18.01.2013 в 13:10)   письмо автору
 
   для: Valick   (18.01.2013 в 11:09)
 

Спасибо, - ознакомлюсь обязательно!

  Ответить  
 
 автор: Sfinks   (18.01.2013 в 13:55)   письмо автору
 
   для: lutsk   (18.01.2013 в 13:10)
 

Вот еще статья по той же теме. Мне кажется более наглядной.
http://www.getinfo.ru/article610.html

  Ответить  
 
 автор: Sfinks   (18.01.2013 в 13:46)   письмо автору
 
   для: lutsk   (18.01.2013 в 10:30)
 

> Значит придется двойным foreach с запросом к базе при каждой итерации обходиться..
Ни в коем случае!
Вообще обращение к БД в цикле - это очень плохо. Всегда нужно стараться этого избежать. А если это не возможно, значит не правильно спроектирована сама БД.

Получайте все данные одним запросом (как я показал или, если возможна ситуация, когда конкретной suggestion_id не соответствует ни один файл, то заменив JOIN на LEFT JOIN) и уже на клиенте разбирайте результат какими угодно циклами.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования