Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Нужна помощь, проблема внутри, Php+mysql
CaH4oO
сообщение 17.07.2009 - 12:17

Частый гость
***

Группа: Участник
Сообщений: 141
Регистрация: 18.03.2005
Пользователь №: 7039


<H3 minmax_bound="true">Нужна помощь по свзяке php+mysql</H3>Задача такова. Есть 3 таблицы
1. link_id | cat_id

2. cat_id | cat_name

3. link_id | link_name



Мне нужно вывести имена категории(cat_name), а под каждом именем категории имена новостей (link_name).

Пример:

1)Аэропланы.
аэроплан1
аэроплан2
2) Холодильники
холодильник1
холодильник 2.

Как мне составить запрос?
Перейти в начало страницы
 
+Цитировать сообщение
Kreon
сообщение 17.07.2009 - 14:18

/dev/random
*******
отличительный знак Z*
Группа: Участник
Сообщений: 2216
Регистрация: 5.11.2006
Пользователь №: 16651


Немного дурацкий способ:
SQL
SELECT t2.cat_id, t2.cat_name, t3.link_name
FROM t1 LEFT JOIN t2 USING ( cat_id )
LEFT JOIN t3 USING ( link_id )
ORDER BY t2.cat_id, t3.link_id ASC;

Затем на php присвоить $i значение 0 и запустить цикл по всем полученным записям. На каждой итерации проверять равенство $i и текущего t2.cat_id. Если они не равны, выводить заголовок новой категории t2.cat_name и ссылку t3.link_name, а также приравнивать $i к t2.cat_id. Если они равны - то просто выводить t3.link_name.
Но здесь проблема будет, если надо это как-нибудь рандомно отсортировать. Впрочем, всю сортировку можно возложить на php...
Перейти в начало страницы
 
+Цитировать сообщение
Bolt Thrower
сообщение 17.07.2009 - 15:05

Частый гость
***

Группа: Участник
Сообщений: 233
Регистрация: 4.01.2006
Пользователь №: 11329


А зачем это делать одним запросом? Категория новостей и новость это разные сущности.
Делай как обычно делают и не заморачивайся не по делу, например так:
Код
$resCat = mysql_query("SELECT cat_id, cat_name FROM t2");
while ($cat = mysql_fetch_assoc($resCat)) {
  echo $cat['cat_name'];
  $resLink = mysql_query("SELECT t3.name FROM t1, t3 WHERE t3.link_id=t1.link_id AND t1.cat_id=$cat[cat_id]");
  while ($link = mysql_fetch_assoc($resLink)) {
    echo $link['link_name'];
  }
}
Перейти в начало страницы
 
+Цитировать сообщение
Kreon
сообщение 17.07.2009 - 15:59

/dev/random
*******
отличительный знак Z*
Группа: Участник
Сообщений: 2216
Регистрация: 5.11.2006
Пользователь №: 16651


Ну если у него там 200 категорий, такой метод создаст 201 запрос. Как-то не айс. smile.gif
Перейти в начало страницы
 
+Цитировать сообщение
Bolt Thrower
сообщение 17.07.2009 - 16:39

Частый гость
***

Группа: Участник
Сообщений: 233
Регистрация: 4.01.2006
Пользователь №: 11329


Для таких случаев человечество придумало кэш.
Перейти в начало страницы
 
+Цитировать сообщение
SHADE
сообщение 17.07.2009 - 21:16

Bill rulz ^^
******
орден IV степени
Группа: Участник
Сообщений: 1418
Регистрация: 28.09.2003
Пользователь №: 24


Не знаю как дела с производительностью на пхп, но вобщем-то можно было бы двумя запросами выбрать
1. категории (2 таблица)
2. новости, заджойненые на маппинг (1 + 3 таблицы)

и потом форичем собрать так как хочется. Т.е. то же самое что сказал Bolt Thrower, только заранее вытащить все данные и работать уже без бд.
Перейти в начало страницы
 
+Цитировать сообщение
CaH4oO
сообщение 18.07.2009 - 23:57

Частый гость
***

Группа: Участник
Сообщений: 141
Регистрация: 18.03.2005
Пользователь №: 7039


спасибо что откликнулись благо дошел сам, использовал метод креона, тупо обьединил таблицы.
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 25.04.2024 - 17:00