Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деревья в MySQL, Помогите пожалуйста составить запрос 
:(
    Опции темы
RomanK
Дата 30.3.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



Например у меня есть четыре таблицы:

Table1: id1, name.
Table2: id2, id1 name.
Table3: id3, id2, name.
Table4: id4, id3, name.

Вот такая вот структура. Точнее дерево. smile

Нужно от туда достать все из таблицы Table1. Для каждого id1 из нее достать все из Table2. Для каждого id2 из нее достать общее количество записей из Table 3, + сумму общего количества соответствующих записей из Table4.

Точнее что то типа этого:
Код

Array
(
    [id1]=1
    [id2]=1
    [count id 3]=10 // Количество записей соответствующих [id2].
    [count id 4]=100 // Количество всех записей для каждого из [id3].
)


Помогите пожалуйста сделать это оним запросом. Уже замучался. smile

ВОБЩЕМ: Оптимизирую свой форум. Тоесть таблица table1 - это категории форумов. Таблица table2 - это форумы. Таблица table3 - это топики в форуме. Таблица table4 - это сообщения.
Так вот надо на главной вывести все категории, форумы для каждой категории, общее количество топиков в форуме, общее количество сообщений в форуме.

Это сообщение отредактировал(а) RomanK - 30.3.2006, 20:23
PM MAIL WWW ICQ   Вверх
RomanK
Дата 30.3.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



В принципе я эту задачу уже решил. Хотя может можно как-нибудь оптимизировать. Если можно подскажите как.
Вот SQL запрос:
Код

SELECT
    t1.id1,
    t2.id2,
    COUNT(DISTINCT t3.id3),
    COUNT(DISTINCT t4.id4)
FROM
    table1 AS t1 LEFT JOIN table2 AS t2 ON (t1.id1=t2.id1)
    LEFT JOIN table3 AS t3 ON (t2.id2=t3.id2)
    LEFT JOIN table4 AS t4 ON (t3.id3=t4.id3)
GROUP BY t2.id2
ORDER BY t1.id1 ASC, t2.id2 ASC;


Теперь в связи с этим еще вопрос. А как исправить этот запрос, чтобы он еще доставал последнюю запись в таблице table3? (ТОЧНЕЕ: достать последний топик для каждого форума)

Пробовал вот так:
Код

SELECT
    t1.id1,
    t2.id2,
    COUNT(DISTINCT t3.id3),
    COUNT(DISTINCT t4.id4),
    l.*
FROM
    table1 AS t1 LEFT JOIN table2 AS t2 ON (t1.id1=t2.id1)
    LEFT JOIN table3 AS t3 ON (t2.id2=t3.id2)
    LEFT JOIN table4 AS t4 ON (t3.id3=t4.id3),
    (SELECT * FROM table3 WHERE id2=t2.id2 ORDER BY `id2` DESC LIMIT 1 ) AS l
GROUP BY t2.id2
ORDER BY t1.id1 ASC, t2.id2 ASC;

Но вылазит ошибка - типа нету такой таблицы t2. Думаю, что она происходит из того, что синонимы таблиц не фигурируют в подзапросах.

Дак вот... как сие организовать?

Это сообщение отредактировал(а) RomanK - 30.3.2006, 22:26
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 30.3.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



RomanK, обычно все данные дерева пихаются в одну таблицу
Код

MyTable
- ID
- FatherID(Allows null)
- Data(name в твоем случае)



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
RomanK
Дата 30.3.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



DeadSoul, ну у меня как бы форум... и не хочется делать ОДНУ таблицу для него.
Вот я чувствую, что чуть-чуть что-то надо подправить/дописать и будет все работать. Только вот нехватает у меня знаний для этого. Поэтому прошу помоч.
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 30.3.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(RomanK @ 30.3.2006, 22:47 Найти цитируемый пост)
ну у меня как бы форум... и не хочется делать ОДНУ таблицу для него.

Тогда да. Просто в первоначальной постановке задачи все таблицы были равноправны.

Форум плоский или древовидный?

Для хранения всех подфорумом ИМХО стоит использовать одну таблицу, т.е. записи
- Форум программистов
- Разработка систем для Web
- PHP
- PHP: взаимодействие с Базами Данных
живут внутри одной таблицы.

Вторая таблица для постов


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
RomanK
Дата 31.3.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



Цитата(DeadSoul @ 30.3.2006, 23:07 Найти цитируемый пост)
Форум плоский или древовидный?

Честно говоря я не знаю такой терминологии.
Ну просто. Есть категории, есть форумы в каждой категории, есть топики в форумах, есть сообщения в топиках. ПОДФОРУМОВ нету. То есть не как здесь.
Типа вот так: Категория: WEB-программирование -> Форум: MySQL -> Топик: Помогите составить запрос.
Думаю структура ясна?
PM MAIL WWW ICQ   Вверх
madFobos
Дата 21.4.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.12.2005

Репутация: нет
Всего: 3



Если ID у тебя AutoIncrement (не пробовал, но предполагаю):
Код

SELECT
    t1.id1,
    t2.id2,
    t3.name,
    COUNT(DISTINCT t3.id3),
    COUNT(DISTINCT t4.id4),
    l.*
FROM
    table1 AS t1 LEFT JOIN table2 AS t2 ON (t1.id1=t2.id1)
    LEFT JOIN table3 AS t3 ON (t2.id2=t3.id2)
    LEFT JOIN table4 AS t4 ON (t3.id3=t4.id3),
    (SELECT * FROM table3 WHERE id2=t2.id2 ORDER BY `id2` DESC LIMIT 1 ) AS l
GROUP BY t2.id2
HAVING MAX(t3.id)
ORDER BY t1.id1 ASC, t2.id2 ASC;
 
PM MAIL   Вверх
jsse
Дата 2.5.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



(SELECT * FROM table3 AS t3, table2 AS t2 WHERE t3.id2=t2.id2 ORDER BY t3.id2 DESC LIMIT 1 ) AS l 
PM WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1985 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.