SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.09.2018 12:41:56

execution
Участник
Зарегистрирован: 27.09.2018
Сообщений: 6

Сортировка не повторяющихся cтрок.

Хочу сделать запрос, чтобы не повторялись строки где одинаковое значение в поле "TargetID" и при этом получать все данные в этой строке.

Попробовал так:

SELECT `PlayerID`, `TargetName`, `TargetID`, `Message`, `Data` FROM `PhoneMessageHistory` WHERE `PlayerID` = '%d' GROUP BY `TargetID` HAVING COUNT(*) = 1 ORDER BY `ID` DESC LIMIT 10


Но выдаёт ошибку:

1055, Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column '######.PhoneMessageHistory.TargetName' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, SelectPhoneMessageHistory, SELECT `PlayerID`, `TargetName`, `TargetID`, `Message`, `Data` FROM `PhoneMessageHistory` WHERE `PlayerID` = '171' GROUP BY `TargetID` HAVING COUNT(*) = 1 ORDER BY `ID` DESC LIMIT 10, 1

Отредактированно execution (27.09.2018 13:04:09)

Неактивен

 

#2 27.09.2018 13:37:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка не повторяющихся cтрок.

Логично, когда делаете группировку - Вы колонку (то есть множество значений) превращаете в скаляр (одно значение)

Изучите
https://sqlinfo.ru/forum/viewtopic.php?id=3839
и
https://sqlinfo.ru/articles/info/18.html


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 01.10.2018 16:17:51

execution
Участник
Зарегистрирован: 27.09.2018
Сообщений: 6

Re: Сортировка не повторяющихся cтрок.

Дело в том, что с SQL контактирую очень редко и немного чайник в этом. Информацию, которую Вы предоставили для меня она не ясна.

Пробовал так:

SELECT DISTINCT (
TargetID
), PlayerID, TargetName, Message, Data, ID
FROM PhoneMessageHistory
WHERE PlayerID =116
ORDER BY ID DESC


Вывелись всё равно повторяющиеся числа в TargetID.

И так пытался:
SELECT * FROM PhoneMessageHistory WHERE PlayerID = 116 GROUP BY TargetID ORDER BY ID DESC


Ошибка:

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'EVEBASE35162.PhoneMessageHistory.ID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Отредактированно execution (01.10.2018 16:36:25)

Неактивен

 

#4 01.10.2018 20:26:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка не повторяющихся cтрок.

Покажите структуру Вашей таблицы

show create table `PhoneMessageHistory`

, также приведите тестовый набор данных и результат, который хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 01.10.2018 21:23:21

execution
Участник
Зарегистрирован: 27.09.2018
Сообщений: 6

Re: Сортировка не повторяющихся cтрок.

CREATE TABLE IF NOT EXISTS `PhoneMessageHistory` (
  `ID` int(9) NOT NULL AUTO_INCREMENT,
  `PlayerID` int(6) NOT NULL,
  `TargetName` int(25) NOT NULL,
  `TargetID` int(6) NOT NULL,
  `Message` varchar(100) NOT NULL,
  `Data` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;


И заполняю так:

INSERT INTO `PhoneMessageHistory` (`ID`, `PlayerID`, `TargetName`, `TargetID`, `Message`, `Data`) VALUES
(1, 116, 0, 171, '1', 1537982610),
(2, 116, 0, 171, '2', 1537982778),
(3, 116, 0, 171, '2', 1537982889),
(4, 119, 0, 171, '2', 1538044757),
(5, 171, 0, 119, '1', 1538044792),
(6, 171, 0, 119, '1', 1538045170);



Сортирую строки так, чтобы TargetID не повторялись и фильтр по столбцу PlayerID и чтобы выдавало 10 результата с конца исходя от сортировки по ID. И самое главное, чтобы я мог взаимодействовать со столбцами (выводило их).


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

1. 1  Примерный запрос:

SELECT * FROM PhoneMessageHistory WHERE PlayerID = 116 GROUP BY TargetID ORDERY BY ID DESC


1. 2  И получим результат:

(3, 116, 0, 171, '2', 1537982889)



2. 1  Примерный запрос:

SELECT * FROM PhoneMessageHistory WHERE PlayerID = 171 GROUP BY TargetID ORDERY BY ID DESC


2. 2  И получим результат:

(6, 171, 0, 119, '1', 1538045170)

Отредактированно execution (01.10.2018 21:30:15)

Неактивен

 

#6 01.10.2018 21:30:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка не повторяющихся cтрок.

Ну вот у Вас
три строки, где TargetID равен 1
и
три строки, где TargetID равен 2.

А по какому критерию должна быть выбрана строка  из трех в результуте?

(1, 116, 0, 171, '1', 1537982610),
(5, 171, 0, 119, '1', 1538044792),
(6, 171, 0, 119, '1', 1538045170);

какая из этих трех?
любая? где data минимальный/максимальный? или?
в общем, критерий должен быть, назовите его.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 01.10.2018 21:35:34

execution
Участник
Зарегистрирован: 27.09.2018
Сообщений: 6

Re: Сортировка не повторяющихся cтрок.

Смысле какой критерий к TargetID? Он без различен. То-есть, если будет 1000 или 50 - разницы нет. Главное, чтобы он не повторялся.

Например, если было так:

(1, 116, 0, 171, '1', 1537982610),
(2, 116, 0, 171, '2', 1537982778),
(3, 116, 0, 88, '2', 1537982889),
(4, 116, 0, 88, '2', 1538044757),
(5, 116, 0, 119, '1', 1538044792),
(6, 116, 0, 119, '1', 1538045170);


То при запросе, у нас получилось так:

(2, 116, 0, 171, '2', 1537982778),
(4, 116, 0, 88, '2', 1538044757),
(6, 116, 0, 119, '1', 1538045170);

Отредактированно execution (01.10.2018 21:46:07)

Неактивен

 

#8 01.10.2018 21:42:57

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка не повторяющихся cтрок.

С чего началось:

Хочу сделать запрос, чтобы не повторялись строки где одинаковое значение в поле "TargetID" и при этом получать все данные в этой строке.

Вы хотите одну строку с targetID. А у Вас их 3 (всм три с targetID=1 и три с targetID=2).

Итак, еще раз

(1, 116, 0, 171, '1', 1537982610),
(5, 171, 0, 119, '1', 1538044792),
(6, 171, 0, 119, '1', 1538045170);

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


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 01.10.2018 21:50:03

execution
Участник
Зарегистрирован: 27.09.2018
Сообщений: 6

Re: Сортировка не повторяющихся cтрок.

Я наверное не так выразился. Хочу, чтобы выводились строки только с уникальными значениями в поле TargetID. А всего выводилось строк -  10 шт. Вы немного путаете значения поля TargetID и поля Message, ибо в поле Message значения 1 и 2, а в поле TargetID - 116, 119 etc. (Выше я привёл пример как оно должно быть)

Отредактированно execution (01.10.2018 21:56:54)

Неактивен

 

#10 01.10.2018 22:41:49

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Сортировка не повторяющихся cтрок.

Если связка TargetID и Data уникальна, то должно вот так сработать, попробуйте

SELECT
  t2.*
FROM
  (SELECT `TargetID`, max(`Data`) AS `Data` FROM `PhoneMessageHistory` GROUP BY `TargetID`) t1
  JOIN `PhoneMessageHistory` t2 USING(`TargetID`, `Data`);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 02.10.2018 07:10:43

execution
Участник
Зарегистрирован: 27.09.2018
Сообщений: 6

Re: Сортировка не повторяющихся cтрок.

Вроде сработало. Огромное спасибо за помощь wink

Отредактированно execution (02.10.2018 07:56:03)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson