[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод категорий.
Joker
Вообщем есть 3 таблицы

project
id | title | date
category
id | title
category_project
id_project | id_category

пол ночи у компа ща заклинило немогу сделать и все....

вот только такое лезит в голову....

PHP
$res = mysql_query("SELECT `id`,`title` FROM `project`");
while ($row = mysql_fetch_array($res))
{
    $result .= "Проект: ".$row['title']." номинирован в следующих категориях: ";
    $res2 = ("SELECT
                cp.`id_category`,
                ct.`title`
            FROM
                `category_project` as cp,
                `category` as ct
            WHERE
                cp.`id_project`='"
.$row['id']."' AND
                ct.`id`=cp.`id_category`
            "
);
    while ($row2 = mysql_fetch_array($res2))
    {
        $result .= $row2['title']." ";
    }
    $result .= "<br/>";
}



соответсвенно может быть хоть сколько проектов хоть сколько категорий и хоть в скольких категорияях проект может быть наменирован


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


Задача вывести проекты и у каждого проекта категории.



Спустя 47 минут, 2 секунды (13.05.2009 - 08:26) glock18 написал(а):
Еще раз повторю: не используйте запросы внутри цикла!

Задачу не совсем понял. Нужно для каждого проекта категории в которых он номинирован?

Если так, то можно примерно так:

1. Тот же запрос, что и у тебя в начале скрипта.
2. В цикле проходишь по результатам - собираешь все проекты, а паралелльно с этим формируешь строку
SQL
IN (1, 3, 5, 8)
из id проектов.
3. Выполняешь такой запрос:
SQL
SELECT cp.id_project, cp.`id_category`, ct.`title`
FROM `category_project` as cp
JOIN `category` as ct ON ct.`id`=cp.`id_category`
WHERE cp.`id_project`IN (#сформированная строка#)

4. Парсишь результат - там должны быть сразу все категории и все проекты.

Спустя 9 минут, 52 секунды (13.05.2009 - 08:36) Joker написал(а):
Цитата (glock18 @ 13.05.2009 - 05:26)
Еще раз повторю: не используйте запросы внутри цикла!


еслибы я этого не знал то не пашел сюда за таким вопросом)) т.к. то что я написал тоже работает.

SQL
SELECT cp.id_project, cp.`id_category`, ct.`title`
FROM `category_project` as cp
JOIN `category` as ct ON ct.`id`=cp.`id_category`
WHERE cp.`id_project`IN (#сформированная строка#)

да так тож делал, но мне почему то кажеться что так лучше не делать.... может от того что не спал сутки... или так правильно???? но мне интересно реально ли с одного запроса это сделать.... тобишь запрос в заросе. Проблемма в том что запрос что внутри должен вывести одно поле и одну строку. У категорий кокраз одно поле но не одна строка вот и вопрос а можно ли обьеденить строки при выводе.....



Спустя 50 минут, 48 секунд Joker написал(а):
glock18 вспомнил этот пример мне не нравиться тем что сначало все проекты нужно запихать в масссив, сформировать эту "строку" сделать второй запрос и уже из запроса и массива формировать вывод....

Спустя 1 час, 54 минуты, 31 секунда (13.05.2009 - 10:30) glock18 написал(а):
Все просто. Смысл двух запросов в том, что у тебя между сущностям отношение MANY-TO-MANY. Можно без проблем вытащить все одним запросом, но это будет лишний трафик от sql (каждый проект будет дублироваться столько раз сколько в нем категорий).

А насчет того, что "проекты нужно запихать в масссив, сформировать эту "строку" сделать второй запрос и уже из запроса и массива формировать вывод....".

Поверь, это будет на порядки быстрее, чем выполнять запросы в цикле.

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

Спустя 1 час, 59 минут, 47 секунд (13.05.2009 - 12:30) Joker написал(а):
Цитата (glock18 @ 13.05.2009 - 07:30)
Поверь, это будет на порядки быстрее, чем выполнять запросы в цикле.

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


да я уже сделал двумя запросами но, все таки оч интересно как это сделать через один запрос?????

Спустя 1 час, 54 минуты, 35 секунд (13.05.2009 - 14:25) glock18 написал(а):
Ок, я посмотрю когда время будет.

Спустя 33 минуты, 3 секунды (13.05.2009 - 14:58) glock18 написал(а):
Сел делать. И не понял в чем сложность. Все просто:
SQL
SELECT cp.id_project, cp.`id_category`, ct.`title`
FROM `project` as p
JOIN `category_project` as cp ON p.id = cp.id_project
JOIN `category` as ct ON ct.`id`=cp.`id_category`

Получится дублирование инфы. Если делать такой запрос, то лучше сделать зануление дублирующих строк.

Спустя 3 часа, 9 секунд (13.05.2009 - 17:58) Joker написал(а):
так и я мог и ночью сделать)) а ты поробуй без дублерования тобишь все категории должны быть в одном поле.

Спустя 2 часа, 54 минуты, 35 секунд (13.05.2009 - 20:52) Alchemist написал(а):
GROUP_CONCAT(), но ИМХО ты маешься дурью

Спустя 1 час, 55 минут, 16 секунд (13.05.2009 - 22:48) Joker написал(а):
лан всем спасибо я довно уж сделал в два запроса, просто ради интереса спросил.

Тема закрыта т.к. вопрос исчерпан.


P.S. Хорошо все таки быть модератором cool.gif

Спустя 1 месяц, 11 дней, 20 часов, 54 минуты, 4 секунды (25.06.2009 - 19:42) Joker написал(а):
Я нашел, решение как сделать в один запрос всё... почему некто не подсказал и чот сразу не додумался.

запрос:

SQL
SELECT
pr.`id`,pr.`title`,pr.`description`,pr.`date`,pr.`price`,pr.`term`,
im.`sub_image` as `image`,
(SELECT
GROUP_CONCAT(t2.title)
FROM `sspy_portfolio_category_conect` as t1,
`sspy_portfolio_category` as t2
WHERE t1.`id_project`=pr.`id` AND t2.`id`=t1.`id_category`
) as cetegory

FROM `portfolio_project` as pr,
`portfolio_images` as im
WHERE pr.`public`='1' AND im.`id`=pr.`id_image`
ORDER BY `id` DESC "



P.S. Тема старая но вдруг кто будет искать по форуму чтоб ответ был в теме.

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

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