Volledige versie bekijken : [MySQL] Order by werkt niet?



Dexter
13 July 2011, 20:01
Ik heb een probleemtje met MySQL en ik vind het probleem niet. :P

Ik heb een functie:


//Haalt alle categoriën op en returnt een resource in alfabetische volgorde van de naam.
function get_all_cats() {
$query = "SELECT * FROM cats ORDER BY naam ASC";
$result = mysql_query($query);
gelukt($result, "De functie get_all_cats() in de functions.php pagina is mislukt.");
//$result is de resource.
return $result;
}

Met naam, de naam van de kolom in de tabel 'cats' (kort voor categorieën).

Daarna doe ik dit:


<ul>
<?php
$resource_cats = get_all_cats();
while($row = mysql_fetch_array($resource_cats)) {
echo "<li><a href=\"view_cat.php?cat=" . $row['id'] . "\">" . $row['naam'] . "</a></li>";
}
?>
</ul>

Waarin ik dus een geordende lijst als html-resultaat verwacht. Echter lukt dit niet, ik krijg (met een paar testwaarden) :



Flash
Java
Objective C
Cascading Style Sheets
HTML
Photoshop
PHP & MySQL
Uncategorized


Welke niet alfabetisch is. :(


Iemand een idee waarom dit niet lukt met "ORDER BY" in de query?

Alvast bedankt,


Dexter

Butterflyice
13 July 2011, 22:04
wat staat er allemaal in de tabel?

Dexter
13 July 2011, 22:13
Het is een kleine tabel hoor. :P
Ik heb even een screenshot genomen van phpMyAdmin.

http://cl.ly/3s2I1K2f2n0V0e3U2l38/Schermafbeelding_2011-07-13_om_22.10.04.png


Dexter

Butterflyice
13 July 2011, 23:15
Als je de tabel naam er bij zet dan zal het beter gaan.


SELECT * FROM cat ORDER BY cat.name ASC

ultddave
14 July 2011, 12:16
In de post hierboven moet het 2x "cats" zijn, ipv "cat". Indien het niet zo werken, kan je eens een dump geven van de die tabel. In PHPMyAdmin moet je de tabel selecteren en dan in het menu "exporteren" kiezen.

Dan kunt ge normaal gezien "SQL" selecteren voor de output, en de rest van de instellingen staat normaal gezien goed, en dan kunt ge gewoon op "start" klikken. Dan krijgt ge zoiets te zien:



CREATE TABLE IF NOT EXISTS `articles` (
`aid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(150) NOT NULL,
`content` tinytext NOT NULL,
`creationdate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`lasteditted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`aid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Gegevens worden uitgevoerd voor tabel `articles`
--

INSERT INTO `articles` (`aid`, `title`, `content`, `creationdate`, `lasteditted`) VALUES
(1, 'test', 'test', '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(2, ' test', 'test', '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(3, 'Hey', 'Hey', '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(4, 'Hallo allemaal.\r\n\r\nIk ben david.\r\n\r\n\r\nDag.', 'test', '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(5, 'blabla', 'blabla dsf', '2011-07-09 22:25:43', '2011-07-09 22:26:11'),
(6, 'test', 'test\r<br />\r<br />\r<br />test\r<br />\r<br />\r<br />test\r<br />\r<br />\r<br />\r<br />\r<br />\r<br />test', '2011-07-09 22:43:20', '2011-07-09 22:43:20');


Die zou ge eens moeten plaatsen hier. Die code kunnen wij dan snel uitvoeren zodat we exact dezelfde tabel hebben, maakt het altijd handiger om te helpen :D.

Maar al uw code zou normaal gezien moeten werken, dus tis inderdaad een vreemd probleem.

Mvg,
Dave

Dexter
14 July 2011, 12:58
Als je de tabel naam er bij zet dan zal het beter gaan.


SELECT * FROM cat ORDER BY cat.name ASC


Thanks maar dat deed het niet. :P (Wel het veranderde gewoon niet, de code is natuurlijk wel juist)


@ultddave: Er is denk ik niet echt iets raar aan deze query maar anyway...


-- phpMyAdmin SQL Dump-- version 2.11.7.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generatie Tijd: 14 Jul 2011 om 12:44
-- Server versie: 5.0.41
-- PHP Versie: 5.2.6


SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


--
-- Database: `bookmark`
--


-- --------------------------------------------------------


--
-- Tabel structuur voor tabel `cats`
--


CREATE TABLE IF NOT EXISTS `cats` (
`naam` varchar(50) NOT NULL,
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;


--
-- Gegevens worden uitgevoerd voor tabel `cats`
--


INSERT INTO `cats` VALUES('Uncategorized', 1);
INSERT INTO `cats` VALUES('Photoshop', 2);
INSERT INTO `cats` VALUES(' Cascading Style Sheets ', 3);
INSERT INTO `cats` VALUES(' HTML ', 4);
INSERT INTO `cats` VALUES(' PHP ', 5);
INSERT INTO `cats` VALUES(' Java ', 6);
INSERT INTO `cats` VALUES(' Flash ', 7);
INSERT INTO `cats` VALUES(' Objective C ', 8);
INSERT INTO `cats` VALUES(' MySQL ', 9);
INSERT INTO `cats` VALUES(' Python ', 10);
INSERT INTO `cats` VALUES(' ZZZZZZ ', 11);


Wat ik wel merkte is dat als ik een naam van een categorie (heb de CRUD voor categorieën al af :) ) wijzig, bijvoorbeeld een 's' aanplakken zodat het alfabetisch niet uitmaakt, dat hij dan ineens wel naar de goede plaats springt. :oink:

Dus nu heb ik mijn functie naar dit aangepast en bij alle tests die ik heb uitgevoerd (dus gewoon een stuk of 10 categorieën bijgevoegd) werkte deze code (dus de lijst van categorieën wordt alfabetisch gerangschikt). :D


//Haalt alle categoriën op en returnt een resource in alfabetische volgorde van de naam.
function get_all_cats() {
mysql_query("UPDATE cats");
$query = "SELECT * FROM cats ORDER BY cats.naam ASC";
$result = mysql_query($query);
gelukt($result, "De functie get_all_cats() in de functions.php pagina is mislukt.");
//$result is de resource.
return $result;
}



Van mij mag hier dus wel een slotje op. :p Bedankt voor de hulp Butterflyice en ultddave. :D



Dexter

ultddave
14 July 2011, 13:15
INSERT INTO `cats` VALUES('Uncategorized', 1);
INSERT INTO `cats` VALUES('Photoshop', 2);
INSERT INTO `cats` VALUES(' Cascading Style Sheets ', 3);
INSERT INTO `cats` VALUES(' HTML ', 4);
INSERT INTO `cats` VALUES(' PHP ', 5);
INSERT INTO `cats` VALUES(' Java ', 6);
INSERT INTO `cats` VALUES(' Flash ', 7);
INSERT INTO `cats` VALUES(' Objective C ', 8);
INSERT INTO `cats` VALUES(' MySQL ', 9);
INSERT INTO `cats` VALUES(' Python ', 10);
INSERT INTO `cats` VALUES(' ZZZZZZ ', 11);


Er zijn wel spaties toegevoegd voor (en na) bijna alle categoriën. De eerste 2 bevatten geen spaties. Eventueel kan je daar eens naar kijken (misschien de oorzaak van het probleem). Want spaties worden ook gebruikt als karakter als je alfabetisch gaat sorteren.

(Bij het inserten desnoods een SQL TRIM uitvoeren op de strings)


Wat ik wel merkte is dat als ik een naam van een categorie (heb de CRUD voor categorieën al af ) wijzig, bijvoorbeeld een 's' aanplakken zodat het alfabetisch niet uitmaakt, dat hij dan ineens wel naar de goede plaats springt.

Dus nu heb ik mijn functie naar dit aangepast en bij alle tests die ik heb uitgevoerd (dus gewoon een stuk of 10 categorieën bijgevoegd) werkte deze code (dus de lijst van categorieën wordt alfabetisch gerangschikt).

Hehe :D. Opzich vreemd, maar zolang het werkt ^^.

Mvg,
Dave

Dexter
14 July 2011, 13:23
Hmmm ja, ik denk dat dat inderdaad de fout is. :D
In mijn query staat inderdaad:

... ' %s ' ...

Heb de spaties nu weggelaten. ;)


Dexter

Butterflyice
14 July 2011, 19:37
oerps foute tabel naam gebruikt hihi