Группа запросов Mysql с сохранением других результатов в конце

#mysql #sql

#mysql #sql

Вопрос:

Рассмотрим следующее:

 CREATE TABLE `content` (
  `idcontent` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `creation_date` date DEFAULT NULL,
  `user_id` int(11) NOT NULL
) ;

CREATE TABLE `editor` (
  `ideditor` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `plan` int(11) NOT NULL DEFAULT '1'
) ;


CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `editor_ideditor` int(11) DEFAULT NULL
) ;

CREATE TABLE `plan` (
  `id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL
) ;

ALTER TABLE `plan`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `plan`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

ALTER TABLE `content`
  ADD PRIMARY KEY (`idcontent`),
  ADD UNIQUE KEY `idcontent_UNIQUE` (`idcontent`),
  ADD KEY `user_id` (`user_id`);


--
-- Index pour la table `editor`
--
ALTER TABLE `editor`
  ADD PRIMARY KEY (`ideditor`),
  ADD UNIQUE KEY `ideditor_UNIQUE` (`ideditor`);


--
-- Index pour la table `user`
--
ALTER TABLE `user`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `iduser_UNIQUE` (`id`),
  ADD KEY `fk_user_editor1_idx1` (`editor_ideditor`);

--
-- AUTO_INCREMENT pour les tables déchargées
--

--
-- AUTO_INCREMENT pour la table `content`
--
ALTER TABLE `content`
  MODIFY `idcontent` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT pour la table `editor`
--
ALTER TABLE `editor`
  MODIFY `ideditor` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT pour la table `user`
--
ALTER TABLE `user`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- Contraintes pour les tables déchargées
--

--
-- Contraintes pour la table `content`
--
ALTER TABLE `content`
  ADD CONSTRAINT `FK_userId_inContent` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;



--
-- Contraintes pour la table `user`
--
ALTER TABLE `user`
  ADD CONSTRAINT `fk_user_editor1_idx1` FOREIGN KEY (`editor_ideditor`) REFERENCES `editor` (`ideditor`);

  ALTER TABLE `editor`
    ADD CONSTRAINT `editor_ibfk_1` FOREIGN KEY (`plan`) REFERENCES `plan` (`id`);

    INSERT INTO `plan` (`id`, `name`) VALUES
    (1, 'free'),
    (2, 'premium'),
    (3, 'gold');

    INSERT INTO `editor` (`ideditor`, `name`, `plan` ) VALUES
    (1, 'editor_free',1),
    (2, 'editor_premium',2),
    (3, 'editor_gold1',3),
    (4, 'editor_gold2',3);

    INSERT INTO `user` (`id`,`name`, `editor_ideditor`) VALUES
    (1, 'user_free',1),
    (2, 'user_premium',2),
    (3, 'user_gold1',3),
    (4, 'user_gold2',4);
    
    INSERT INTO `content` (`idcontent`, `name`,`creation_date`,`user_id`) VALUES
    (1, 'content_free','2020-12-10',1),
    (2, 'content_premium','2020-12-10',2),
    (3, 'content1_gold_user_gold1','2020-12-10',3),
    (4, 'content2_gold_user_gold1','2020-12-09',3),
    (5, 'content1_golduser_gold2','2020-12-08',4),
    (6, 'content2_golduser_gold2','2020-12-07',4);

    

    
 

http://sqlfiddle.com /#!9/b6f820/1

У меня есть эти таблицы: содержимое создается пользователем, у которого есть редактор (компания), у которого есть план (бесплатный, премиум и т. Д.)

Мне нужно получить все содержимое, упорядоченное по плану, затем creation_date, но сначала по одному редактору, а затем все остальное содержимое.

Так что это почти работает с группой by, но это не так, потому что я не получаю оставшееся содержимое :

 select *
from content
LEFT JOIN user ON content.user_id  = user.id
LEFT JOIN editor ON user.editor_ideditor  = editor.ideditor
group by editor.ideditor
order by editor.plan DESC, content.creation_date DESC
 

Я хотел бы получить их в таком порядке:

 3
5
2
1
4
6
 

и я получаю только 3 5 2 1

Комментарии:

1. Обратите внимание, что мы прекратили писать запросы таким образом примерно в 1992 году. Приходите. ПРИСОЕДИНЯЙТЕСЬ к нам.

2. Ха-ха, да, отредактировано! 😉

3. Почему вы используете a GROUP BY ? Как вы думаете , что это делает?

4. Я знаю, что это не решение. Я использую его, чтобы сначала получить только один контент с помощью редактора.