2

我有一张桌子:

ID    TYPE     VALUE
1     phone    12345
2     fax      98753
3     address  etc
...

TYPEcol 定义为具有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,然后是 ,然后faxaddress

但我希望输出按以下顺序排列:

1- 全部address 2- 全部Phone 3- 全部fax

我怎么能做到这一点?

谢谢你的帮助 :-)

4

2 回答 2

3

试试这个查询 -

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 |
+------+---------+-------+
于 2013-05-24T15:30:20.227 回答
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);
于 2013-05-24T15:26:39.350 回答