我有一张桌子:
ID TYPE VALUE
1 phone 12345
2 fax 98753
3 address etc
...
TYPE
col定义为ENUM
,其值为'phone','fax','address'
。
现在我的查询是:
$q = mysql_query(SELECT * FROM tbl ORDER BY id);
while(row = mysql_fetch_array($q)){
echo $row['type'] . "--->" . $row['value'];
}
输出按ID排序,第一行为phone
,然后是fax
,然后是address
。
但我希望输出顺序为:
1-所有address
2-全部Phone
3-全部fax
我怎么能做到这一点?
感谢您的帮助: - )
答案 0 :(得分:2)
SELECT A.*,
case ID
when 3 then 1
when 2 then 3
when 1 then 2
else 4 end as myorder
FROM tbl A
ORDER BY myOrder
或者更新枚举以在类型字段中首先列出数字,例如01.Address, 02.Phone, 03.Fax
..然后按类型而不是ID列出您的订单。第二种方法可以很容易地添加多达99种类型而不必更改代码(只是数据),如果稍后使用第一种方法添加另一种类型,则必须编辑SQL ...
第一种方法使用case语句在运行时生成计算列。这个新列包含正确的顺序,通过将ID替换为您想要的顺序(它不会更改ID,它只是按您想要的顺序定义它们),然后通过这个新的计算列进行排序。
$q = mysql_query(SELECT A.*, case ID when 3 then 1 when 2 then 3 when 1 then 2 else 4 end as myorder FROM tbl A ORDER BY myOrder);
第二种方法涉及更改枚举中的数据,使其前面有一个定义所需排序的数字。因此,如果您更改排序中的SQL以按类型而不是ID排序,那么它将起作用。
$q = mysql_query(SELECT * FROM tbl ORDER BY Type);
答案 1 :(得分:2)
尝试此查询 -
SELECT * FROM tbl
ORDER BY
CASE type
WHEN 'address' THEN 1
WHEN 'phone' THEN 2
WHEN 'fax' THEN 3
ELSE 4
END
完整示例:
CREATE TABLE tbl (
id int(11) DEFAULT NULL,
type enum ('phone', 'fax', 'address') DEFAULT NULL,
value int(11) DEFAULT NULL
);
INSERT INTO test.tbl(id, type, value) VALUES
(1, 'phone', 11),
(2, 'fax', 22),
(3, 'address', 33),
(4, 'fax', 44),
(5, 'address', 55);
SELECT * FROM tbl
ORDER BY
CASE type
WHEN 'address' THEN 1
WHEN 'phone' THEN 2
WHEN 'fax' THEN 3
ELSE 4
END;
+------+---------+-------+
| id | type | value |
+------+---------+-------+
| 3 | address | 33 |
| 5 | address | 55 |
| 1 | phone | 11 |
| 2 | fax | 22 |
| 4 | fax | 44 |
+------+---------+-------+