Fazla 1 tamsayı ile yargıç durumuna yan tümcesinde bir 'ORDER BY' Geliştirilmesi

6 Cevap php

Bana iyi bir Artan içine sütun ve (bir tablo satır başlığı tıklama üzerine) azalan sırayla sıralamak sağlayan bazı PHP kodu var. Bu ancak bir miktar sütun için, benim DOB sütunu (tarih / zaman alan türü ile) için mükemmel çalışır.

Örneğin, 10, 50, 100, 30 ve başka bir 100 quantites sahiptir.

10, 100, 100, 30, 50 ... ve 50, 30, 100, 100, 10: Sipariş çok sütunun benim sıralama bu sırayla biter, sadece 1 tamsayı takdir edilecek gibi görünüyor.

Bu tabii ki 100 50'den büyük olduğu için yanlıştır, bu nedenle hem 100 değerleri kesinlikle sonunda görünmelidir? Sistem başka bir 0 vardır tanır çünkü 100 sadece '1 'değerine sahip olarak dikkate alınması ediliyor gibi geliyor bana, o zaman 10 önce görünür.

Bunun için normal mi? Ben bu sorunu çözebilir herhangi bir yolu var mı? Herhangi bir yardım için teşekkür ederiz. P.S. Ben gerekirse kod gösterebilir, ancak bu varsayılan ortak bir sorun olup olmadığını bilmek istiyorum.

6 Cevap

Dizeleri olarak bu değerleri dikkate alınarak, yerine sayı olarak göre sıralama gibi geliyor. Ne sıralama yapıyor? PHP veya MySQL? Aslında sıralama oluyor kodunu görmeden neyin yanlış olduğunu söylemek zor.

dizeleri ve sayılar değil sıralama gibi görünüyor, sütunun veri türü nedir? Dize numaraları sıralamak tek yolu düzgün önde sıfır eklemek için, ama bu doğru türü bu verileri depolamak için iyi, yani manipülasyonlar bu çeşit bir veri seçmek her zaman yapmak zorunda değilsiniz.

Nedense bir karakter türü olarak sütunu bırakmak gerekir durumunda, sipariş için uygun bir sayısal türe çevirebilirsiniz. Bu sadece olsa sütunu değiştirerek daha az verimlidir.

ORDER BY CAST(theColumn AS DECIMAL(5, 2)) 

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

Sizin sütun, bir metin türüdür. Kalıcı sütun türünü değiştirmek, ya da sıralama yaptığınızda çevirebilirsiniz.

Masa (Eğer farklı bir varsayılan değer isteyebilirsiniz) değiştirebilir

 ALTER TABLE [Table]
MODIFY COLUMN [Column] INTEGER UNSIGNED NOT NULL DEFAULT '0';

Veya dökme zaman sıralama

SELECT *
  FROM [Table]
 ORDER BY CAST([Column] as UNSIGNED INTEGER) ASC;

İşletme alanı muhtemelen karakter / varchar / metin olarak / ..., yani string type ve bir {[(1)}] olarak tanımlanır. Bu durumda lexicographical sıralama gerçekleştirilmiştir.

Sıralama yerine tamsayılar dizeleri olarak verilerinizi tedavi edilir. Veritabanındaki sütunun veri türünü kontrol edin. Bu bir sayı değil, bir dize ise, veri veritabanı ve sıralama rutin arasında bir yerde dizelere dönüştürülür ediliyor.