【问题标题】:mysql group by, field querymysql group by,字段查询
【发布时间】:2012-01-31 15:33:30
【问题描述】:

用非常简单的术语来解释它,我有以下几点:

-------------------------------------------------------------------------------
id  Title                              unique_id  type  language  category       
-------------------------------------------------------------------------------
1   Announcement One                        111     1   1         5,6,8
2   Announcement Two                        112     1   1         6
3   Announcement Three                      113     1   1         7
4   Ankundigung Drei                        113     1   2         7,3
5   Announcement Four                       115     1   1         6
6   Announcement of another type            116     2   1         5
7   Another announcement of another type    117     2   1         7
8   Ein anderes ankundigung                 117     2   2         7
9   Subtype 3                               118     3   1         4
10  Tip 3                                   118     3   2         4
-------------------------------------------------------------------------------

这里的关键字段是unique_id(这是一个唯一的公告ID,而不是主ID)。

公告列表为英语 (Language=1),偶尔也有德语公告 (Language=2) - 与 unique_id 113,117 和 118 一样。

我想做的是英文用户可以看到英文版的公告,德文用户也可以看到英文版的公告,因为德语用户默认也是英文的。但是,只有在公告还有德语版本的情况下,该版本才应该以德语而不是英语向德国用户显示。

我认为我可以通过简单的GROUP BY unique_id 和语言(asc 或 desc)来实现这一点,但这会引发非常不可预测的结果,并且显然无法正常工作。

另外,我想按指定的类别对结果进行排序,例如:field (category, 7,6,2) 然后其余类别按升序排序。对于类别,如果可能,我想使用 contains,因为一个公告可能有多个类别,在这种情况下,我认为必须使用 contains 进行排序。因此,德国用户应该会看到以下结果:

-------------------------------------------------------------------------------
id  Title                              unique_id  type  language  category       
-------------------------------------------------------------------------------
1   Ankundigung Drei                        113     1   2         7,3
2   Ein anderes ankundigung                 117     2   2         7
3   Announcement One                        111     1   1         5,6,8
4   Announcement Two                        112     1   1         6
5   Announcement Four                       115     1   1         6
6   Tip 3                                   118     3   2         4
7   Announcement of another type            116     2   1         5
-------------------------------------------------------------------------------

这是我第一次在stackoverflow上发布问题,希望我发布了一个好的问题:)

提前致谢

完整的SQL如下:

-- Table structure for table `anns`
--

CREATE TABLE IF NOT EXISTS `anns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(254) NOT NULL,
  `unique_id` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  `language` int(11) NOT NULL,
  `category` varchar(254) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `anns`
--

INSERT INTO `anns` (`id`, `title`, `unique_id`, `type`, `language`, `category`) VALUES
(1, 'Announcement One', 111, 1, 1, '2,6,8'),
(2, 'Announcement Two', 112, 1, 1, '6'),
(3, 'Announcement Three', 113, 1, 1, '7'),
(4, 'Ankundigung Drei', 113, 1, 2, '7'),
(5, 'Announcement Five', 115, 1, 1, '6'),
(6, 'Announcement of another type', 116, 2, 1, '6'),
(7, 'Another announcement of another type', 117, 2, 1, '7'),
(8, 'Ein anderes ankundigung', 117, 2, 2, '7'),
(9, 'Subtype 3', 118, 3, 1, '4'),
(10, 'Tip 3', 118, 3, 2, '4');   

【问题讨论】:

  • 请问您现在的SELECT 声明是什么?
  • 我还没有,这是我正在实施的新功能。我一直在尝试各种版本,但它们都没有为我提供所需的结果。我正在考虑的最后一个选项是通过 PHP 实现它,但我假设必须有一种方法可以直接通过 MySQL 完成。
  • 为什么,为什么category 列中有多个值?

标签: php mysql group-by sql-order-by


【解决方案1】:

这可能有助于为德国用户检索结果:

SELECT *
FROM (
    SELECT * 
    FROM  `anns` 
    ORDER BY  `announcement_id` ,  `language` DESC
) `TA`
GROUP BY `TA`.`announcement_id`;

我没有添加基于类别的排序,因为我不确定行为。但也许您可以尝试在 GROUP BY 之后放置 ORDER BY,例如:

ORDER BY `TA`.`category` DESC"

希望对你有帮助!

【讨论】:

    【解决方案2】:
    ( SELECT Title,unique_id,type,language,category
        FROM anns 
        WHERE language=2
      UNION
      SELECT Title,unique_id,type,language,category
        FROM anns a 
        WHERE language=1 
          AND NOT EXISTS( SELECT 1 FROM anns a2 
                          WHERE a2.unique_id=a.unique_id 
                            AND a2.language=2 )
    ) ORDER BY 2
    

    这里选择德语元素和没有德语元素的英语元素。

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多