Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: naturalne sortowanie VARCHAR *prosze o pomoc*
Forum PHP.pl > Forum > Bazy danych
Therronis
nie wiem czy dobrze topic napisalem - mam pytanie : jak zrobic by wyniki zapytania MySQL dawalo wyniki posortowane naturalnie (1,2,12,20) wg kolumny okreslonej jako VARCHAR. dotychczasowe moje starania nie pozwalaja mi osiagnac nic wiecej niz wyniki posortowane tak: 1,12,2,20 - a nie o to mi chodzi. jeszcze jedno - musze miec kolumne oznaczona jako VARCHAR...

prosze o pomoc

PS
nie potrafilem znalezc nic na ten temat na forum i w necie...
s_w_ir
Ja też miałem taki problem. Zrobiłem tak ż e przewaliłem wszystko do tablic($tablica[] - żeby nie było) i dopiero tam sortowałem.
Sądze tylko że nie będzie to dobre rozwiązanie dla wielomilionowych rekordów sad.gif
Jabol
mysql na pewno ma funkcje typu atoi(). musisz tylko zdefiniować jaka długość pola jest zarezerowowana na liczbę. Ogólnie możesz też dodać dodatkowe pole sort_ord
adwol
[sql:1:c2a747213c]select pole from tabela order by cast(pole as unsigned);[/sql:1:c2a747213c]
Therronis
@adwol : chyba nie moze VARCHAR potraktowac jako UNSIGNED poniewaz UNSIGNED jest chyba zarezerwowane dla kolumn okreslonych jako liczbowe (INT, TINIINT, etc) - wyskakuje taki komunikat

[sql:1:799d1b4f3b]Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource ...[/sql:1:799d1b4f3b]

@Jabol : szukalem funkcji atoi() w manualu, ale jej tam nie ma sad.gif

@s_w_ir : masz racje, ciezko to bedzie sad.gif

hmmm... nie wiem jak to zrobie, chyba cos bede kombinowal z dawaniem do tablicy dwuch rekordow, pozniej sortowaniem tablicy, a po tym listowaniem wg posortowanej tablicy...
Jabol
@Therronis: bo też nie mówiłem, że jest. Poszukaj jakiejś funkcji która robi integera z asci.
adwol
Cytat
@adwol : chyba nie moze VARCHAR potraktowac jako UNSIGNED poniewaz UNSIGNED jest chyba zarezerwowane dla kolumn okreslonych jako liczbowe (INT, TINIINT, etc) - wyskakuje taki komunikat

Musiałeś coś źle przepisać. To działa.
Therronis
@Jabol : funkcja cast() moze spelnic taka funkcje posrednio jak mysle

@adwol : hmm...

[sql:1:4067db782e]SELECT *
FROM tabela
ORDER BY cast(pole AS UNSIGNED)
DESC
LIMIT 500, 700;[/sql:1:4067db782e]

czy to poprawnie zapisane? bo nie jestem pewnien :/ nie wiem czy moge miec tez starsza baze danych, ale watpie.
adwol
Cytat
[sql:1:5fcd2b6547]SELECT *
FROM tabela
ORDER BY cast(pole AS UNSIGNED)
DESC
LIMIT 500, 700;[/sql:1:5fcd2b6547]

czy to poprawnie zapisane? bo nie jestem pewnien :/ nie wiem czy moge miec tez starsza baze danych, ale watpie.

Tak.
Spróbuj wpisać to bezpośrednio w shellowym kliencie albo zrób w PHPie:
[php:1:5fcd2b6547]<?php
print mysql_error();
?>[/php:1:5fcd2b6547]
i pokaż jaki masz błąd.
U mnie na 4.0.15 działa to bezproblemowo.
Therronis
[php:1:35af554ee8]<?php
$result = mysql_query ("
SELECT *
FROM klienci
ORDER BY cast($sort_ AS UNSIGNED)
$order_
LIMIT $i, $ii");
?>[/php:1:35af554ee8]

[sql:1:35af554ee8]You have an error in your SQL syntax near '(KB_minuta AS UNSIGNED) LIMIT 0, 200' at line 4[/sql:1:35af554ee8]

KB_minuta to wartosc zmiennej $sort_
Jabol
a jaka wersja ( [manual:c97054a238]mysql_get_server_info()[/manual:c97054a238] )?
adwol
Cytat
KB_minuta to wartosc zmiennej $sort_

A co masz w zmiennej $order_? Nie dublujesz sobie czasami frazy ORDER BY? Wypisz sobie gdzieś dokładnie to co dostaje mysql_query (z rozwiniętymi wartościami zmiennych $sort_ i $order_).
Therronis
wersja 3.23.55 :/

w zmiennej order_ mam wartosc DESC lub nie mam nic

mysle ze to jednak wersja sad.gif

jednakze dziekuje za pomoc smile.gif
DeyV
Therronis - tak czy inaczej - wydrukuj nam to zapytanie, zwykłym
[php:1:580cc2d703]<?php
$pyt= "SELECT ... ";
mysql_query ($pyt) or die ( "Bład w zapytaniu : ". $pyt );
?>[/php:1:580cc2d703]
uboottd
Cytat
wersja 3.23.55 :/
mysle ze to jednak wersja sad.gif

Tak, cast(cos as typ) wystepuje od wersji4. Jednak na szybko mozesz zastosowac takie wyjatkowo chamskie zagranie:
[sql:1:0a0d65afe1]
SELECT *
FROM tabela
ORDER BY pole+0 DESC
LIMIT 500, 700;
[/sql:1:0a0d65afe1]
pkwiatkowski
Ja chcialem odswiezyc temat bo nie znalazlem odpowiedzi na ten problem, moze dojdziemy do tego na przykladzie mojego:

mam w kolumnie dane:

WRA38
WAR12
WAR102
CH12
CH4

No i chcialbym zeby to posortowalo tak:

CH4
CH12
WRA12
WRA38
WAR102

Da jakoś radę to zrobić SQLem ?
pkwiatkowski
Cytat(erix @ 13.07.2009, 17:23:22 ) *


poczytam zobacze co tu zamiesciles.
Dzieki za odpowiedz na problem.

edit
Jednak to nie zdalo egzaminu w moim przypadku sad.gif

chyba jednak cos w PHP wymysle zeby to sortowac.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.