Сгруппировать по коду и отсортировать по номеру? Не справиться,прошу помочь

P
На сайте с 06.01.2009
Offline
601
515

Здравствуйте, Уважаемые Гуру. Не справиться.

$result66 = mysql_query("SELECT `id`, `unicode`
FROM `zeny` WHERE `unicode`!='unicode' GROUP BY `unicode`;");
while ($row = mysql_fetch_array($result66, MYSQL_ASSOC)) {
$idt = $row['id'];
$unicode= $row['unicode'];
...

Таблица. 10000 тыс товаров. У некоторых совпадают unicode. Но у каждого из них свой номер.

Нужно сгруппировать по unicode (это получается), но сортировка происходит по id товара. Это логично. Не получается сделать сортировку по внутреннему номеру. Прошу помочь. Спасибо!

Вот так не работает.:gm:

$result66 = mysql_query("SELECT `id`, `unicode`
FROM `zeny` WHERE `unicode`!='unicode' GROUP BY `unicode` ORDER by `nomer`;");
while ($row = mysql_fetch_array($result66, MYSQL_ASSOC)) {
$idt = $row['id'];
$unicode= $row['unicode'];
...

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

[umka]
На сайте с 25.05.2008
Offline
456
#1

Когда вы делаете группировку, то из всех записей с одинаковым "unicode" остаётся одна (произвольная с произвольным nomer-ом).

Соответственно, не понятно, что именно вы хотите отсортировать по nomer-у.

Приведите примеры, что ли. Какие данные есть и какие вы хотите получить на выходе.

Лог в помощь!
S
На сайте с 30.09.2016
Offline
469
#2

while ($row = mysql_fetch_array($result66, MYSQL_ASSOC))  {

$idt = $row['id'];
$unicode= $row['unicode'];
Надеюсь, дальше эти переменные уникализируются?

---------- Добавлено 06.04.2018 в 20:37 ----------

postavkin:
Нужно сгруппировать по unicode
GROUP BY - это не совсем сгруппировать в обычном понимании. Это сгруппировать и выбросить одинаковые значения.
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
P
На сайте с 06.01.2009
Offline
601
#3
'[umka:
;15550832']Когда вы делаете группировку, то из всех записей с одинаковым "unicode" остаётся одна (произвольная с произвольным nomer-ом).
Соответственно, не понятно, что именно вы хотите отсортировать по nomer-у.
Приведите примеры, что ли. Какие данные есть и какие вы хотите получить на выходе.

Прикрепил срин.

Надо при группировке отсортировать по nomermodif

[ATTACH]172999[/ATTACH]

Сейчас так

$result66 = mysql_query("SELECT `id`, `unicode`, `ur`

FROM `zeny` WHERE `unicode`!='unicode' GROUP BY `unicode`;");
while ($row = mysql_fetch_array($result66, MYSQL_ASSOC)) {
$idt = $row['id'];
$unicode= $row['unicode'];
$ur= $row['ur'];

и в итоге

// для unicode ...641it - - - $ur= "ee|aa", а надо чтобы было "аа|ее", согласно порядку nomermodif

// для unicode ...642it - - - $ur= "kk|cc", а надо чтобы было "cc|kk", согласно порядку nomermodif

// для unicode ...643it - - - $ur= "pp|oo", а надо чтобы было "oo|pp", согласно порядку nomermodif

jpg 172999.jpg
[umka]
На сайте с 25.05.2008
Offline
456
#4

Не понял, откуда у вас берётся "ee|aa" и "kk|cc", т.к. никакой конкатенации в запросе нет.

Но если вы хотите, чтобы во время группировки из объединяемых записей оставалась только та, у которой меньший nomermodif, можно попробовать сделать так:

SELECT z1.id, z1.unicode, z1.ur FROM zeny z1 LEFT JOIN zeny z2 ON z1.unicode=z2.unicode AND z1.nomermodif>z2.nomermodif WHERE z2.unicode IS NULL

На больших табличках будет медленно ворочаться.

Но со вложенными запросами будет ещё медленнее.

В общем, задача не для MySQL :D

P
На сайте с 06.01.2009
Offline
601
#5
'[umka:
;15556391']Не понял, откуда у вас берётся "ee|aa" и "kk|cc", т.к. никакой конкатенации в запросе нет.

!!!Да, простите, я не весь код показал, мой косяк.

		$polyanamecherezslesh = array('ur', 'artikulfabriki','razmer','tolshina');
foreach ($polyanamecherezslesh as $value) {
$polyaharslesh .= "GROUP_CONCAT(`$value` ORDER BY `id` SEPARATOR '|') AS `$value`, ";
}
$polyaharslesh = trim($polyaharslesh, ", ");
$query="SET group_concat_max_len=2048";


$result66 = mysql_query("SELECT `id`, `unicode`, $polyaharslesh
FROM `zeny` WHERE `unicode`!='unicode' GROUP BY `unicode`;");
while ($row = mysql_fetch_array($result66, MYSQL_ASSOC)) {
$idt = $row['id'];
$unicode= $row['unicode'];
$ur= $row['ur'];
'[umka:
;15556391']Но если вы хотите, чтобы во время группировки из объединяемых записей оставалась только та, у которой меньший nomermodif,

нет, надо все, но в порядке по nomermodif

Кажется я понял, просто этого куска когда не видел (забыл про него), надо поменять ORDER BY `id` на ORDER BY `nomermodif`

На больших табличках будет медленно ворочаться.
Но со вложенными запросами будет ещё медленнее.
В общем, задача не для MySQL

Скрипт запускается разово, в среднем раз в неделю, для формирования структуры другой таблицы...

[umka]
На сайте с 25.05.2008
Offline
456
#6

Если надо отсортировать внутри GROUP_CONCAT, соответственно, надо пользоваться тем ORDER BY, который внутри GROUP CONCAT

P
На сайте с 06.01.2009
Offline
601
#7
'[umka:
;15556454']Если надо отсортировать внутри GROUP_CONCAT, соответственно, надо пользоваться тем ORDER BY, который внутри GROUP CONCAT

Да, как выше написал, уже догадался, просто в упор это не видел..

Спасибо, что помогли!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий