2016-04-29 4 views
1

Здравствуйте, друзья, я работаю на запрос, чтобы получить список реестра, но мне нужно получить повторяющиеся записи, и сохранить только то, что есть больше, длинаMysql PHP Выберите с несколькими значениями, MAX (ДЛИНА())

Пример таблица:

ID  = INT Auto increment 
IDref = INT not null 
UserId = INT ZeroFill 

+--------+---------+--------+---------+ 
| ID  | IDref | UserId |   | 
+--------+---------+--------+---------+ 
| 1  | 1  | 00001 |   | 
| 3  | 1  | 001 |   | 
| 4  | 1  | 002 |   | 
| 5  | 2  | 00001 |   | 
| 6  | 2  | 001 |   | 
| 7  | 2  | 002 |   | 
| 8  | 3  | 00001 |   | 
| 9  | 4  | 002 |   | 
+--------+---------+--------+---------+ 

запросов

SELECT ID, IDref, UserId 
FROM Table 
WHERE UserId = '00001' OR '002' 
GROUP BY IDref 
HAVING count(IDref) > 0 
ORDER BY CHAR_LENGTH(UserId) DESC 
LIMIT 1 

Update Я адресности

+--------+---------+--------+---------+ 
| ID  | IDref | UserId |   | 
+--------+---------+--------+---------+ 
| 4  | 1  | 002 |   | 
+--------+---------+--------+---------+ 

я обязательно этот вывод:

+--------+---------+--------+---------+ 
| ID  | IDref | UserId |   | 
+--------+---------+--------+---------+ 
| 1  | 1  | 00001 |   | 
| 5  | 2  | 00001 |   | 
| 8  | 3  | 00001 |   | 
| 9  | 4  | 002 |   |//count(IDref) > 0// one registry find. 
+--------+---------+--------+---------+ 

Но не работает мой запрос. кто-то может мне помочь.

Последнее обновление с рабочим кодом Спасибо Barmar:

SELECT t1.ID, t1.IDref, t1.UserId 
FROM Table1 AS t1 
JOIN (SELECT IDref, MAX(LENGTH(UserId)) AS maxlength 
     FROM Table1 
     WHERE UserID IN ('00001', '002') 
     GROUP BY IDref) AS t2 
ON t1.IDref = t2.IDref AND LENGTH(t1.UserId) = t2.maxlength 
WHERE t1.UserId IN ('00001', '002') 

нормально, но, возможно, вы видите, производительность этого запроса в виде таблицы с 20000 записей будет быстрее?

+0

какие результаты/запроса вы получаете хотя ? – Kruser

+0

все время получить UserId короткий реестр .... все 002 –

+0

Я обновил это сообщение –

ответ

1
WHERE UserId = '00001' OR '002' 

не правильный способ проверить, если столбец соответствует либо из этих значений. Правильный путь

WHERE UserId IN ('00001', '002') 

Ваш код эквивалентен

WHERE (UserId = '00001') OR '002' 

, которая всегда верно, потому что '002' не является ложным.

Вы также должны удалить LIMIT 1. В противном случае вы получите только один из IDRef, который имеет дубликаты.

ORDER BY LENGTH(UserId) не делает сгруппированное значение выберите строку с самой длинной длиной - заказ делается после группировки, и группировка просто выбирает один из значений произвольно. Для этого вам нужно использовать один из методов в SQL Select only rows with Max Value on a Column

SELECT t1.ID, t1.IDref, t1.UserId 
FROM Table1 AS t1 
JOIN (SELECT IDref, MAX(LENGTH(UserId)) AS maxlength 
     FROM Table1 
     WHERE UserID IN ('00001', '002') 
     GROUP BY IDref) AS t2 
ON t1.IDref = t2.IDref AND LENGTH(t1.UserId) = t2.maxlength 
WHERE t1.UserId IN ('00001', '002') 

Там нет необходимости HAVING COUNT(IDRef) > 0, потому что граф всегда больше 0.

DEMO

+0

, если, конечно, вы правы, проблема связана с «Where IN» и фильтром дубликатов и символами длины. потому что он продолжает показывать, , потому что результат все еще показывает мне меньше строки, а не больше. –

+0

Обновлен ответ, чтобы показать, как получить самый длинный идентификатор пользователя. – Barmar

+0

Я получаю эту ошибку: Неизвестный столбец «t2.IDref» в разделе «on» –

Смежные вопросы