MySQL группа по, поле запроса - PullRequest
0 голосов
/ 31 января 2012

Чтобы объяснить это очень просто, у меня есть следующие пункты:

-------------------------------------------------------------------------------
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 (это уникальный идентификатор объявления, а не основной идентификатор).

Список объявлений составлен на английском языке (язык = 1), и время от времени появляются объявления также на немецком языке (язык = 2) - как в случае с unique_id 113,117 и 118.

Что я хочу сделать, так это чтобы английские пользователи увидели английскую версию объявлений, а немецкие пользователи увидели и английскую версию объявлений, потому что английский язык по умолчанию также используется для немецких пользователей. Однако, только в тех случаях, когда существует также немецкая версия объявления, эта версия должна отображаться для немецких пользователей на немецком, а не на английском языке.

Я думал, что смогу достичь этого с помощью простого GROUP BY unique_id и языка (asc или desc), но это приводит к очень непредсказуемым результатам и, очевидно, не работает.

Кроме того, я хотел бы упорядочить результаты по указанным категориям, используя, например: field (category, 7,6,2), а затем упорядочить остальные категории в порядке возрастания. Для категорий, если возможно, я хочу использовать содержит, потому что одно объявление может иметь несколько категорий, и в этом случае я считаю, что содержание должно использоваться для сортировки. Итак, немецкий пользователь должен увидеть следующий результат:

-------------------------------------------------------------------------------
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');   

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Это может помочь получить результаты для немецких пользователей:

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

Я не добавил сортировку по категориям, потому что не уверен в поведении. Но, возможно, вы можете попробовать добавить ORDER BY после GROUP BY, например:

ORDER BY `TA`.`category` DESC"

Надеюсь, это поможет!

0 голосов
/ 31 января 2012
( 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

Выбирает немецкие элементы и английские элементы, где нет немецких элементов.

...