The Shed is going Social! Join us on FaceBook and Twitter and chime in on the conversation.
|
 |
|
Dev Shed Forums
> Databases
> MySQL Help
|
PHP-General - Ordering Numbers
Discuss Ordering Numbers in the MySQL Help forum on Dev Shed. Ordering Numbers MySQL Help forum discussing administration, SQL syntax, and other MySQL-related topics. MySQL is an open-source relational database management system (RDBMS).
|
|
 |
|
|
|
|

Dev Shed Forums Sponsor:
|
|
|

March 19th, 2013, 08:33 AM
|
|
Registered User
|
|
Join Date: Feb 2013
Posts: 20
Time spent in forums: 6 h 11 m 46 sec
Reputation Power: 0
|
|
|
PHP-General - Ordering Numbers
Hi,
I used mysql query "SELECT DISTINCT productname FROM tablename GROUP BY productname" for getting products from table.Result is
"A4 Heavy Cover Booklets 12pp
A4 Heavy Cover Booklets 16pp
A4 Heavy Cover Booklets 20pp
A4 Heavy Cover Booklets 24pp
A4 Heavy Cover Booklets 28pp
A4 Heavy Cover Booklets 80pp
A4 Heavy Cover Booklets 8pp "
But, How can we get results starting with "A4 Heavy Cover Booklets 8pp"?
Example:
A4 Heavy Cover Booklets 8pp
A4 Heavy Cover Booklets 12pp
A4 Heavy Cover Booklets 16pp
A4 Heavy Cover Booklets 20pp
A4 Heavy Cover Booklets 24pp
A4 Heavy Cover Booklets 28pp
A4 Heavy Cover Booklets 80pp
Please help me.
Thanks
|

March 19th, 2013, 08:38 AM
|
 |
kill 9, $$;
|
|
Join Date: Sep 2001
Location: Shanghai, An tSín
|
|
|
This is an SQL question rather than a PHP one so I've moved it to the appropriate forum.
Last edited by ishnid : March 19th, 2013 at 08:43 AM.
|

March 19th, 2013, 08:41 AM
|
 |
Contributing User
|
|
Join Date: Nov 2012
Location: Iran / France
|
|
Why not adding an ORDER BY clause directly to your query?
Here is an example based on your sample data:
Code:
mysql> SELECT productName
-> FROM
-> (
-> SELECT 'A4 Heavy Cover Booklets 12pp' AS productName FROM DUAL UNION ALL
-> SELECT 'A4 Heavy Cover Booklets 16pp' AS productName FROM DUAL UNION ALL
-> SELECT 'A4 Heavy Cover Booklets 20pp' AS productName FROM DUAL UNION ALL
-> SELECT 'A4 Heavy Cover Booklets 24pp' AS productName FROM DUAL UNION ALL
-> SELECT 'A4 Heavy Cover Booklets 28pp' AS productName FROM DUAL UNION ALL
-> SELECT 'A4 Heavy Cover Booklets 80pp' AS productName FROM DUAL UNION ALL
-> SELECT 'A4 Heavy Cover Booklets 8pp' AS productName FROM DUAL
-> ) AS products_tab
-> GROUP BY productName
-> ORDER BY productName DESC;
+------------------------------+
| productName |
+------------------------------+
| A4 Heavy Cover Booklets 8pp |
| A4 Heavy Cover Booklets 80pp |
| A4 Heavy Cover Booklets 28pp |
| A4 Heavy Cover Booklets 24pp |
| A4 Heavy Cover Booklets 20pp |
| A4 Heavy Cover Booklets 16pp |
| A4 Heavy Cover Booklets 12pp |
+------------------------------+
7 rows in set (0.00 sec)
mysql>
Regards,
Dariyoosh
|

March 19th, 2013, 08:51 AM
|
|
Registered User
|
|
Join Date: Feb 2013
Posts: 20
Time spent in forums: 6 h 11 m 46 sec
Reputation Power: 0
|
|
|
Hi dariyoosh,
Thanks for you reply.Actually my client need
"A4 Heavy Cover Booklets 8pp
A4 Heavy Cover Booklets 12pp
A4 Heavy Cover Booklets 16pp
A4 Heavy Cover Booklets 20pp
A4 Heavy Cover Booklets 24pp
A4 Heavy Cover Booklets 28pp
A4 Heavy Cover Booklets 80pp"
this result.
|

March 19th, 2013, 08:53 AM
|
|
Registered User
|
|
Join Date: Feb 2013
Posts: 20
Time spent in forums: 6 h 11 m 46 sec
Reputation Power: 0
|
|
|
Hi ishnid,
This is not an SQL base question.It may be PHP.
|

March 19th, 2013, 09:46 AM
|
 |
pollyanna
|
|
Join Date: Jul 2012
Location: Germany
|
|
Hi,
your actual problem is that your table structure is broken. You have different data all crammed into one big string. This means that the data is basically inaccessible to the database system -- which brings up the question why you even use a relational database system.
Sure, you can do some workarounds with PHP. But that's just ugly, slow, and you'll fight the same problems again and again (as you can see in your previous posts).
If you have any chance to fix the structure, do it. Look up "normalization", specifically "first normal form". That's the only real solution. Otherwise, well, prepare for an endless fight and many, many ugly workarounds that will kill the performance. You'll have to put all rows into an array and then call usort on it. The custom compare function has to extract each number with a regex and then sort by that.
|

March 19th, 2013, 11:09 AM
|
 |
SQL Consultant
|
|
Join Date: Feb 2003
Location: Toronto Canada
|
|
Quote: | Originally Posted by dariyoosh
Code:
-> ORDER BY productName DESC;
| A4 Heavy Cover Booklets 8pp |
| A4 Heavy Cover Booklets 80pp |
| because ORDER BY isn't good enough
you said DESC, so 8pp should've come last instead of first
|

March 19th, 2013, 11:10 AM
|
 |
SQL Consultant
|
|
Join Date: Feb 2003
Location: Toronto Canada
|
|
Quote: | Originally Posted by Sarath_PHP This is not an SQL base question.It may be PHP. | it's definitely not a php problem
it's actually a bad data problem
|

March 19th, 2013, 11:12 AM
|
 |
SQL Consultant
|
|
Join Date: Feb 2003
Location: Toronto Canada
|
|
Quote: | Originally Posted by Sarath_PHP SELECT DISTINCT productname FROM tablename GROUP BY productname | just a note for your future reference...
GROUP BY produces unique results, so DISTINCT here is redundant
|

March 19th, 2013, 10:05 PM
|
|
Registered User
|
|
Join Date: Mar 2013
Posts: 3
Time spent in forums: 3 h 16 m 22 sec
Reputation Power: 0
|
|
|
Right() and left()
Although I am a newbie to SQL, my instinct from other environments is that you might be able to solve the problem by first grabbing the four rightmost characters of the data using right(data,4) and then grab the left two characters of that, such as left(right(data,4),2)
I have often had to do this sort of disecting and data cleanup in Excel when people feed me crappy data.
Of course, since the data you gave us is only a sample, I realize the required cleanup could be more involved.
|

March 20th, 2013, 01:01 AM
|
|
Registered User
|
|
Join Date: Feb 2013
Posts: 20
Time spent in forums: 6 h 11 m 46 sec
Reputation Power: 0
|
|
|
Hi Finance Newbie,
Thanks i got it. I include right() in to mysql query.
"SELECT productname FROM tablename GROUP BY productname ORDER BY RIGHT( productname, 4)"
Then my result is:
A4 Heavy Cover Booklets 8pp
A4 Heavy Cover Booklets 12pp
A4 Heavy Cover Booklets 16pp
A4 Heavy Cover Booklets 20pp
A4 Heavy Cover Booklets 24pp
A4 Heavy Cover Booklets 28pp
A4 Heavy Cover Booklets 80pp
|

March 20th, 2013, 03:18 AM
|
 |
Contributing User
|
|
Join Date: Nov 2012
Location: Iran / France
|
|
Quote: | Originally Posted by r937 because ORDER BY isn't good enough
you said DESC, so 8pp should've come last instead of first |
Thanks for this remark, yes in fact I made a mistake and my solution doesn't fulfil the OP's requirement.
Regards,
Dariyoosh
|

March 20th, 2013, 09:01 AM
|
|
Registered User
|
|
Join Date: Mar 2013
Posts: 3
Time spent in forums: 3 h 16 m 22 sec
Reputation Power: 0
|
|
Quote: | Originally Posted by Sarath_PHP Hi Finance Newbie,
Thanks i got it. I include right() in to mysql query.
"SELECT productname FROM tablename GROUP BY productname ORDER BY RIGHT( productname, 4)"
Then my result is:
A4 Heavy Cover Booklets 8pp
A4 Heavy Cover Booklets 12pp
A4 Heavy Cover Booklets 16pp
A4 Heavy Cover Booklets 20pp
A4 Heavy Cover Booklets 24pp
A4 Heavy Cover Booklets 28pp
A4 Heavy Cover Booklets 80pp |
Also, I pointed to the complex solution but forgot to think about the simple solution: If the problem is only occurring once AND you can play with the source data, maybe just go in and add an additional space or a zero in front of the eight.
|

March 22nd, 2013, 02:13 AM
|
|
Registered User
|
|
Join Date: Feb 2013
Posts: 20
Time spent in forums: 6 h 11 m 46 sec
Reputation Power: 0
|
|
Quote: | Originally Posted by r937 just a note for your future reference...
GROUP BY produces unique results, so DISTINCT here is redundant |
Thank you so much.
|
Developer Shed Advertisers and Affiliates
| Thread Tools |
Search this Thread |
|
|
|
| Display Modes |
Rate This Thread |
Linear Mode
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
|
|