Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > ALL UNION


Автор: gcc 17.12.2009, 05:53
Код

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, стратегии, Флеш-игры ... 

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

Автор: ТоляМБА 17.12.2009, 07:15
Код
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



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

Автор: gcc 17.12.2009, 10:31
а подскажите, можно ли тут сделать LIMIT 3 чтобы было максимум 3 подкатегории ??

нужно добавить вложеный запрос и там подсчитать минимальные три id_se? 

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

Автор: gcc 17.12.2009, 10:53
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, я так понял что нельзя...

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

оптимизированные запросы немогу научиться писать...

Автор: Akina 17.12.2009, 11:10
Переведи ещё раз, особенно обратив внимание на выделенное слово.
Цитата

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: 

Автор: ТоляМБА 17.12.2009, 11:48
Код
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

Автор: gcc 17.12.2009, 12:11
я вот нашле еще такой вариант, только с двух таблиц

Код

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
    Учеба
Общество
    Культура 

Автор: gcc 17.12.2009, 13:16
есть задачка 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 



Автор: Akina 17.12.2009, 18:36
Счас выдам тебе крокодила, оптимизи сам.

Таблица 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;

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)