首页 > 解决方案 > Mysql request group by 将其他结果保留在最后

问题描述

考虑以下:

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,但首先由编辑器排序,然后是所有其他内容。

所以它几乎可以与 group 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

标签: mysqlsql

解决方案


推荐阅读