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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ALL UNION 
V
    Опции темы
gcc
Дата 17.12.2009, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



Код

SELECT t3.id_se, t3.name_se, t3.parent_se_id
        FROM section AS t3
        WHERE t3.parent_se_id = 1
        
        
        UNION ALL
  
        SELECT t1.id_se, t1.name_se, t1.parent_se_id
            FROM  section AS t1 
            WHERE
          t1.parent_se_id = t3.id_se


ошибка
Код

execute failed: Unknown column 't3.id_se' in 'where clause'



хотел вывести одим запросом ближайщие подкатегории, так сделано тут например: http://yaca.yandex.ru/yca/cat/Entertainment/

категори: Игры
подкатегории:     3D-шутеры, RPG, стратегии, Флеш-игры ... 

тут только в процедуре можно?

PM WWW ICQ Skype GTalk Jabber   Вверх
ТоляМБА
Дата 17.12.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


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

Репутация: 10
Всего: 252



Код
SELECT t3.id_se, t3.name_se, t3.parent_se_id
        FROM section AS t3
        WHERE t3.parent_se_id = 1
        
        
        UNION ALL
  
        SELECT t1.id_se, t1.name_se, t1.parent_se_id
            FROM  section AS t1 
            INNER JOIN section AS t2
            ON  t1.parent_se_id = t2.id_se
            WHERE t2.parent_se_id = 1



PM   Вверх
Akina
Дата 17.12.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



gcc, в union запросы независимы. Поэтому ссылка на объект вне подзапроса недопустима.


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

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


Агент алкомафии
****


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

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



а подскажите, можно ли тут сделать LIMIT 3 чтобы было максимум 3 подкатегории ??

нужно добавить вложеный запрос и там подсчитать минимальные три id_se? 
PM WWW ICQ Skype GTalk Jabber   Вверх
Akina
Дата 17.12.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



gcc, я дико извиняюсь, но справку читать не пробовали? там в главе 12.2.7.3. UNION Syntax специально указано, где можно, где бессмысленно и где нельзя указывать лимиты, сортировки и всё остальное...


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

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


Агент алкомафии
****


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

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



Akina,  сори может быть я плохо перевел на русский http://dev.mysql.com/doc/refman/5.1/en/union.html
(в некоторых ЯП можно делать далеко то, что не написано в документации  smile )

Код

SELECT t3.id_se, t3.name_se, t3.parent_se_id
        FROM section AS t3
        WHERE t3.parent_se_id = 1

        
        UNION ALL
  
        SELECT t1.id_se, t1.name_se, t1.parent_se_id
            FROM  section AS t1 
            INNER JOIN section AS t2
            ON  t1.parent_se_id = t2.id_se
            WHERE t2.parent_se_id = 1
           LIMIT 3


оно под категории не вывело в 3, я так понял что нельзя...

подумал, может быть можно было каким-то форусом

оптимизированные запросы немогу научиться писать...
PM WWW ICQ Skype GTalk Jabber   Вверх
Akina
Дата 17.12.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Переведи ещё раз, особенно обратив внимание на выделенное слово.
Цитата

To use an ORDER BY or LIMIT clause to sort or limit the entire UNION result, parenthesize the individual SELECT statements and place the ORDER BY or LIMIT after the last one.

Цитата

To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT: 



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

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


Котэ
***


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

Репутация: 10
Всего: 252



Код
SELECT t3.id_se, t3.name_se, t3.parent_se_id
FROM section AS t3
WHERE t3.id_se =1
UNION ALL
SELECT a.id_se,a.name_se, a.parent_se_id
FROM (
SELECT t1.id_se, t1.name_se, t1.parent_se_id
FROM section AS t1
INNER JOIN section AS t2 ON t1.parent_se_id = t2.id_se
WHERE t2.id_se =1
LIMIT 3
) AS a

PM   Вверх
gcc
Дата 17.12.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



я вот нашле еще такой вариант, только с двух таблиц

Код

SELECT SQL_NO_CACHE n.id,n.date,n2.title,c.id,c.date,c.body
FROM (
SELECT id,date
FROM news
ORDER BY date DESC
LIMIT 10
) as n
JOIN news as n2
ON n2.id=n.id
JOIN comment as c
ON c.news_id=n.id
AND c.date >= IFNULL((
SELECT c1.date
FROM comment as c1
WHERE c1.news_id=n.id
ORDER BY c1.date DESC
LIMIT 10,1
),«0/0/0»)
ORDER BY n.date DESC,c.date DESC; 


Добавлено через 1 минуту и 19 секунд
ТоляМБА, не работает, выдает левые 4 записи 
  Tree
    Учеба
Общество
    Культура 

PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 17.12.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



есть задачка http://habrahabr.ru/blogs/mysql/44807/

Цитата

Есть новостной блоггерный сайт. Есть такие сущности как новости и комментарии к ним.

Задача — нужно написать запрос, который выводит список из 10 новостей определенного типа (задается пользователем) отсортированные по времени издания в хронологическом порядке, а также к каждой из этих новостей показать не более 10 последних коментариев, т.е. если коментариев больше — показываем только последние 10.


решение

Код

CREATE TABLE `news` (
`id` int(11) NOT NULL auto_increment,
`date` datetime NOT NULL,
`title` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `date` (`date`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `comment` (
`id` int(11) NOT NULL auto_increment,
`news_id` int(11) NOT NULL,
`date` datetime NOT NULL,
`body` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `news` (`news_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Код

SELECT n. *, c. *
FROM (
SELECT *
FROM news
WHERE
type = 2
ORDER BY date DESC
LIMIT 10
) as n
INNER JOIN (
SELECT *
FROM comments
WHERE
comments.news_id IN (
SELECT news.id
FROM news
WHERE
type = 2
ORDER BY date DESC
)
ORDER BY date DESC
LIMIT 10
) AS c
ON c.news_id = n.id 



как сюда прикрутить мой вариант

вот я пробовал - не хочет....

Код

SELECT n. *, c. *
FROM (
SELECT *
FROM section as t1


LIMIT 10
) as n
INNER JOIN (
SELECT *
FROM section as t2
WHERE
t2.id_se IN (
SELECT t3.id_se
FROM section as t3


)

LIMIT 10
) AS c
ON c.id_se = n.parent_se_id 




Это сообщение отредактировал(а) gcc - 17.12.2009, 13:18
PM WWW ICQ Skype GTalk Jabber   Вверх
Akina
Дата 17.12.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Счас выдам тебе крокодила, оптимизи сам.

Таблица message: id, mdata, mtext
Таблица comment: id, message_id, cdata, ctext
Запрос 1 (q1)
Код

SELECT c1.*
FROM comment AS c1 
INNER JOIN comment AS c2 
ON c1.message_id = c2.message_id
WHERE c1.cdata<=c2.cdata

Запрос 2 (q2)
Код

SELECT q1.message_id, q1.cdata, q1.ctext
FROM q1
GROUP BY q1.message_id, q1.cdata, q1.ctext
HAVING Count(q1.message_id)<=10

Запрос 3 (q3)
Код

SELECT message.id, message.mdata, message.mtext
FROM message
ORDER BY message.mdata DESC
LIMIT 10

Запрос 4 (q4)
Код

SELECT q3.id as id, q3.mdata as msdata, q3.mtext as mstext
FROM q3
UNION ALL 
SELECT q2.message_id, q2.cdata, q2.ctext
FROM q2

Запрос 5 (q5)
Код

SELECT q4.id, q4.msdata, q4.mstext
FROM q4
ORDER BY q4.id, q4.msdata

Всё в кучу
Код

SELECT q4.id, q4.msdata, q4.mstext
FROM
(
  SELECT q3.id as id, q3.mdata as msdata, q3.mtext as mstext
  FROM 
  (
    SELECT message.id, message.mdata, message.mtext
    FROM message
    ORDER BY message.mdata DESC
    LIMIT 10
  ) as q3
  UNION ALL 
  SELECT q2.message_id, q2.cdata, q2.ctext
  FROM 
  (
    SELECT q1.message_id, q1.cdata, q1.ctext
    FROM 
    (
      SELECT c1.*
      FROM comment AS c1 
      INNER JOIN comment AS c2 
      ON c1.message_id = c2.message_id
      WHERE c1.cdata<=c2.cdata
    ) as q1
    GROUP BY q1.message_id, q1.cdata, q1.ctext
    HAVING Count(q1.message_id)<=10
  ) as q2
) as q4
ORDER BY q4.id, q4.msdata;

Последний запрос проверил на реальных данных. Работает.


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

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


 




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


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

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