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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать хитрый запрос 
:(
    Опции темы
sergejzr
Дата 19.9.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Приветы! Есть форум, есть таблица:

| post | topic | author |

Ествственно к одному топику относятся много постов, у каждого из которых есть однозначный автор.

Теперь необходимо выбрать из этой таблицы только те топики, куда постили авторы X, Y, Z, .. вместе.


Для двух авторов решение есть:

Код

SELECT p.topic FROM posts p, posts t where p.topic=t.topic
                        AND  p.author='X'  AND  t.author='Y';


Как видим, получается JOIN нехилый. Если расширить запрос до 3 авторов, то БД не справляется при большом количестве данных. А мы хотим, что бы запрос работал для 2-5 авторов минимум.....

Вопрос бы решился вложенными селектами, но их в мускуле не существует....




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
DENNN
Дата 19.9.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не понял. Одна запись в БД - один ответ одного из авторов?
Почему же тогда не подходит:
Код

select topic from posts where author='X' or author='Y'
?

Или все немного сложнее и эти авторы тоже выбираются из других таблиц?
PM ICQ   Вверх
sergejzr
Дата 19.9.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



При твоём запросе выберуться топики, где атор X или Y.
Надо, чтобы выбрались только те топики, где автором был и X и Y.

Как например этот топик, куда мы с тобой сейчас пишем. Он должен попадать при поиске sergej.z и DENN.
То есть только те топики, где мы с тобой пересекались.
Просто топики, где постил я, а ты нет, или наоборот в результат входить не должны.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
IZ@TOP
Дата 19.9.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



sergej.z, сложный вопрос, мне кажется что твой вариант самый оптимальный. А вложенные селекты есть в MySQL начиная с версии 4.1.x.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
sergejzr
Дата 19.9.2005, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



А можно ли как нибуть ограничить количество в течении исполнения запроса? Просто он уже для 3-х человек загибается. Может через temp таблицу? Ведь задачка по сути своей простенькая. Но чтото не как к решению не подъехать smile))


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
IZ@TOP
Дата 19.9.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Создан индекс на поле author?

Что-то я ни как не могу представить как при помощи временной таблицы реализовать... хотя что-то в голове крутится... но ни как...
Добавлено @ 13:20
Количество можно ограничить при помощи директивы limit 0, 10.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 19.9.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(IZ @ 19.9.2005, 14:12)
Что-то я ни как не могу представить как при помощи временной таблицы реализовать... хотя что-то в голове крутится... но ни как...

Выбираем во временную таблицу все темы, где есть посты автора 1.
Выбираем из нее во вторую временную таблицу все темы, где есть посты автора 2.
Выбираем из нее в третью временную таблицу все темы, где есть посты автора 3.
...
Выбираем из нее в N-ю временную таблицу все темы, где есть посты автора N.

Последняя временная таблица и есть то что ты хочешь.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sergejzr
Дата 19.9.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



smile
Выбираем во временную таблицу все темы, где есть посты автора 1.
Вот как это сделать smile В ней ведь должны быть также посты автора 2 и автора 3 иначе мы их из неё уже выбрать не сможем.

Это надо типа
Код

/*выберем все топики автора:*/
CREATE TEMPORARY TABLE t1 AS SELECT DISTINCT topic  from posts p WHERE p.author_id=$author1;

/*теперь создаём таблицу posts, только "обрезанную" на нужные топики:
надо же и других авторов топика задействовать..
*/
CREATE TEMPORARY TABLE t2 AS SELECT p.post,p.topic,p.author from posts p,   t1 t WHERE p.topic=t.topic;

/*Только после этого в t2 у нас результат готовый к дальнейшей обработке.*/
/*Пошли во второй круг:*/
CREATE TEMPORARY TABLE t3 AS SELECT DISTINCT topic  from t2 p WHERE p.author_id=$author2;
CREATE TEMPORARY TABLE t4 AS SELECT p.post,p.topic,p.author from t3 p,   t2 t WHERE p.topic=t.topic;

/*итд*/


Это же сколько темпов надо smile ....
Вопрос наклёвывается.... оптимальнее нельзя? smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Akina
Дата 19.9.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(sergej @ 19.9.2005, 17:02)
Вопрос наклёвывается.... оптимальнее нельзя?

Можно. Обновить mySQL, чтобы можно было вложенные селекты.

А еще можно

Код

CREATE TEMPORARY TABLE t1 AS SELECT DISTINCT topic, author FROM posts WHERE (author = 'Автор1') OR (author = 'Автор2') OR ...
SELECT topic, COUNT(topic) AS ct FROM t1 WHERE ct=N


где N = количество авторов.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sergejzr
Дата 19.9.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Akina?
хитро, умно :? держи звезду!


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 19.9.2005, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Хм... Последний не прокатывает..
Код

SELECT topic, COUNT(topic) AS ct FROM t1 WHERE ct=N


Говорит "unknown column 'ct' in where clause".
Это приколы мускула?....




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Akina
Дата 19.9.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Возможно он не умеет агрегатные функции именовать - попробуй либо where count(topic)=N, либо просто вторую временную таблицу сделать... мне попробовать негде - мускула поставленного нету...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sergejzr
Дата 19.9.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Немножко пришлось переделать. Работает на ураю Респект тебе, Акина!

Код

CREATE TEMPORARY TABLE IF NOT EXISTS t1 AS SELECT DISTINCT p.author_id, p.topic_id FROM ibf_posts p WHERE (p.author_id = 'Автор1') OR (p.author_id = 'Автор2') OR ..;

CREATE TEMPORARY TABLE IF NOT EXISTS t2 AS SELECT topic_id, COUNT(topic_id) as cnt FROM t1 GROUP BY topic_id;

SELECT topic_id  FROM t2 WHERE {$cnt}=cnt ;

Вопос только остался, как скомпоновать запросы, чтобы таблицу не создавать лишнюю?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Бонифаций
Дата 19.9.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 20
Всего: 40



Цитата(sergej @ 19.9.2005, 16:51)
Хм... Последний не прокатывает..
Код

SELECT topic, COUNT(topic) AS ct FROM t1 WHERE ct=N


Говорит "unknown column 'ct' in where clause".
Это приколы мускула?....

приколы sql-я . Патамучта group by не написал


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
sergejzr
Дата 19.9.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Цитата
приколы sql-я . Патамучта group by не написал

Я написал, он всё равно на "unknown column" ругается.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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