MYSQL: использование GROUP BY со строковыми литералами - PullRequest
1 голос
/ 12 октября 2010

У меня есть следующая таблица с этими столбцами:

shortName, fullName, ChangelistCount

Есть ли способ сгруппировать их по строковому литералу в их fullName?Полное имя представляет каталоги файлов, поэтому я хотел бы отображать результаты для определенных родительских папок вместо отдельных файлов.

Я пробовал что-то вроде:

GROUP BY fullName like "%/testFolder/%" AND fullName like "%/testFolder2/%"

Однако это только на самом делегруппы по первому совпадению ....

Спасибо!

Ответы [ 3 ]

3 голосов
/ 12 октября 2010

Возможно, вы хотите что-то вроде:

GROUP BY IF(fullName LIKE '%/testfolder/%', 1, IF(fullName LIKE '%/testfolder2/%', 2, 3))

Ключевая идея для понимания заключается в том, что выражение типа fullName LIKE foo AND fullName LIKE bar состоит в том, что все выражение обязательно будет иметь значение TRUE или FALSE, поэтому из этого можно получить только две группы.

Использование выражения IF для возврата одного из нескольких различных значений позволит вам получить больше групп.

Имейте в виду, что это не будет особенно быстро. Если у вас очень большой набор данных, вам следует изучить другие способы хранения данных, которые не потребуют LIKE сравнений для группировки.

2 голосов
/ 12 октября 2010

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

    FROM (SELECT SUBSTR(fullname, ?)AS derived_column
            FROM YOUR_TABLE ) x
GROUP BY x.derived_column
0 голосов
/ 11 января 2018

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

Здесь я хотел сгруппировать всех пользователей по их городам, которые были в поле адреса.

SELECT ut.* , c.city, ua.*
FROM  `user_tracking` AS ut
LEFT JOIN cities AS c ON ut.place_name LIKE CONCAT(  "%", c.city,  "%" )
LEFT JOIN users_auth AS ua ON ua.id = ut.user_id
...