|
|
|
| Есть таблица "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"? | |
|
|
|
|
|
|
|
для: 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 сформировать массив в требуемом виде. | |
|
|
|
|
|
|
|
для: Sfinks
(18.01.2013 в 00:24)
| | Sfinks, ваш запрос не верен, а если записи, соответствующей id записи Васи в таблице files не будет?
Не надо забывать про левое соединение. | |
|
|
|
|
|
|
|
для: oradev
(18.01.2013 в 08:27)
| | Возможно. Зависит от структуры базы. Может быть и JOIN и LEFT JOIN. Автор этого не оговорил. | |
|
|
|
|
|
|
|
для: Sfinks
(18.01.2013 в 09:14)
| | Sfinks, автор привел структуру, а ваш запрос без LEFT ничего не вернет вообще в случаи который привел я , не надо придумывать. | |
|
|
|
|
|
|
|
для: oradev
(18.01.2013 в 09:29)
| | У вас самоцель со мной поспорить чтоли?
Я говорю о том, что если ВАШ пример НЕ ВОЗМОЖЕН по логике данных (а такие примеры сплошь и рядом), то и LEFT не нужен.
Кроме того, ЧИТАЙТЕ УСЛОВИЕ!
> вытащить все "file_name", принадлежащие "suggestions"
В первую очередь нужны файлы, а не suggestions с файлами или без них.
Поэтому JOIN, JEFT JOIN, RIGHT JOIN, CROSS JOIN нужно использовать там где это надо, а не везде где не попадя. | |
|
|
|
|
|
|
|
для: Sfinks
(18.01.2013 в 13:40)
| | Да кто вам сказал, что его надо применять везде не попадя - вы придумываете опять что-то, ею Богу, я такого не говорил, лишь привел что будет с вашим запросом без LEFT.
Зачем же обрывать вопрос, я только не понимаю
все "file_name", принадлежащие "suggestions", которые в свою очередь пренадлежат "Vasya"
Васи нет в files и все приехали, но есть в suggestions.
Спорить с вами, да куда там. | |
|
|
|
|
|
|
|
для: Sfinks
(18.01.2013 в 00:24)
| | Такой запрос я уже пробовал. На уровне базы данных вроде древовидной структуры не реализовать. Значит придется двойным foreach с запросом к базе при каждой итерации обходиться.. | |
|
|
|
|
|
|
|
для: lutsk
(18.01.2013 в 10:30)
| | Автор, а что вы хотите получить на выходе ?
Развернутое дерево ?
Гораздо лучше предварительно загрузить данные в массив из базы, ключом будет родитель, а элементами например объект - соответствующей вашей каждой строке из базы.
А получить дерево одним запросом можно, например предварительно отсоритовав дерево. | |
|
|
|
|
|
|
|
для: oradev
(18.01.2013 в 10:38)
| | Так видимо и сделаю. | |
|
|
|
|
|
|
|
|
для: Valick
(18.01.2013 в 11:09)
| | Спасибо, - ознакомлюсь обязательно! | |
|
|
|
|
|
|
|
для: lutsk
(18.01.2013 в 13:10)
| | Вот еще статья по той же теме. Мне кажется более наглядной.
http://www.getinfo.ru/article610.html | |
|
|
|
|
|
|
|
для: lutsk
(18.01.2013 в 10:30)
| | > Значит придется двойным foreach с запросом к базе при каждой итерации обходиться..
Ни в коем случае!
Вообще обращение к БД в цикле - это очень плохо. Всегда нужно стараться этого избежать. А если это не возможно, значит не правильно спроектирована сама БД.
Получайте все данные одним запросом (как я показал или, если возможна ситуация, когда конкретной suggestion_id не соответствует ни один файл, то заменив JOIN на LEFT JOIN) и уже на клиенте разбирайте результат какими угодно циклами. | |
|
|
|