Склеить 2 запроса

127
15 декабря 2016, 15:46

Не могу склеить эти 2 запроса

SELECT q.*
FROM `subscribers` AS sub, `questions` AS q
WHERE (sub.id = 1 AND q.to = sub.id_subscriber)
ORDER BY `time` DESC
LIMIT 20
SELECT d.*
FROM `subscribers` AS sub, `discussion` AS d
WHERE (sub.id = 1 AND d.to = sub.id_subscriber)
ORDER BY `time` DESC
LIMIT 20

Делаю так

(
  SELECT q.`id`, q.`text`, q.`reply`, q.`time`, q.`from`, q.`to`, q.`ip`, q.`is_anonum`, 'null' AS q.`question_id`
  FROM `subscribers` AS sub, `questions` AS q
  WHERE (sub.id = 1 AND q.to = sub.id_subscriber)
  ORDER BY `time` DESC
  LIMIT 20
)UNION (
  SELECT d.`id`, d.`text`, d.`reply`, d.`time`, d.`from`, d.`to`, d.`ip`, d.`is_anonum`, 'null' AS d.`likes`, 'null' AS d.`discussion`, 'null' AS d.`salt`
  FROM `subscribers` AS sub, `discussion` AS d
  WHERE (sub.id = 1 AND d.to = sub.id_subscriber)
  ORDER BY `time` DESC
  LIMIT 20
)
ORDER BY `time` DESC

Но меня посылают куда по дальше, вот дамп если что

CREATE TABLE `discussion` (
  `id` int(11) NOT NULL auto_increment,
  `question_id` int(11) NOT NULL, 
  `text` TEXT NOT NULL, -- Вопрос
  `reply` TEXT NOT NULL, 
  `time` int(11) NOT NULL,
  `from` int(11) NOT NULL, 
  `to` int(11) NOT NULL, 
  `ip`  varchar(25) NOT NULL default '', 
  `is_anonum` TINYINT(1) NOT NULL, 
  PRIMARY KEY (`id`)
) ENGINE = MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;
CREATE TABLE `questions` (
  `id` int(11) NOT NULL auto_increment, 
  `text` TEXT NOT NULL, 
  `reply` TEXT NOT NULL, 
  `time` int(11) NOT NULL, 
  `likes` int(8) NOT NULL default '0',
  `discussion` int(8) NOT NULL default '0',
  `salt` char(3) NOT NULL default '', 
  `from` int(11) NOT NULL, 
  `to` int(11) NOT NULL, 
  `ip`  varchar(25) NOT NULL default '', 
  `is_anonum` TINYINT(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE = MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;
CREATE TABLE `subscribers` (
  `id` int(11) NOT NULL, -- id юзера
  `id_subscriber` int(11) NOT NULL, -- На кого подписан юзер
  `time` int(11) NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=cp1251;
Answer 1

Но меня посылают куда по дальше

Вам наверняка показывается сообщение об ошибке. Ваше высказывание абсолютно не информативно.

Попробую помочь.

Запись вот такого рода:

'null' AS q.question_id

неверна и приводит к ошибке. Вероятнее всего, вы перепутали значения местами
и на самом деле хотели написать вот так (забыв подключить таблицу в условии выборки):

q.`question_id` AS 'null'

Но даже если исправить все ошибки такого рода, у вас есть еще одна:

Использовать UNION можно только тогда, когда
все запросы возвращают одинаковое количество столбцов,
которые содержат совместимые типы данных.

У вас же в первом запросе возвращается на два столбца меньше.

Исправьте эти ошибки и запрос заработает.

Answer 2

Для того, чтобы "склеить" два запроса оператором UNION нужно, чтобы количество столбцов в обоих запросах было одинаковым. Также должны совпадать типы столбцов.

READ ALSO
Сортировка статей по двум полям

Сортировка статей по двум полям

Добрый день! Возникла проблема с сортировкой полей, не знаю как ее решить

164
Проверка текста для отправки в БД

Проверка текста для отправки в БД

Проблема в том, что при получении текста с БД я получаю экраннированные кавычки

162
Вывод всех строк

Вывод всех строк

Делаю список юзеров в форме таблицы, и столкнулся с тем, что

181
Рекомендации по меткам

Рекомендации по меткам

Например пользователь лайкает видеоУ видео есть метки например: США, война, Сирия

148