按字段排序,仅在存在时才排序

时间:2012-03-06 17:31:57

标签: mysql sql

我正在尝试获取所有用户,并通过另一个表上的字段对其进行排序,但此字段并不总是存在?

用户 - 持有用户 用户元 - 保存元数据,特别是“权重”,这是我正在尝试订购的。

更具体的解决方案是自动将它们定义为默认重量,但无论如何我可以使它无需工作吗?当前工作查询:

SELECT * FROM users u, usermeta um 
WHERE u.ID = um.ID 
  AND u.name LIKE '%search_terms%';

部分丢失订单,任何/所有帮助都将不胜感激!

3 个答案:

答案 0 :(得分:5)

如果表格之间存在关键关系(u.ID = um.ID)并且您希望列出所有用户,则可以使用weight usermeta上的LEFT JOIN来订购此类用户。

usermeta可让您保留所有用户,无论他们是否存在于SELECT *, IFNULL(um.weight,9999) as newweight FROM users u LEFT JOIN usermeta um on u.ID = um.ID WHERE u.name LIKE '%search_terms%' ORDER BY IFNULL(um.weight,9999); 中:

{{1}}

答案 1 :(得分:1)

您可以使用MySQL的IFNULL来定义权重的默认值

请参阅:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

答案 2 :(得分:1)

SELECT * 
FROM users u, usermeta um 
WHERE u.ID = um.ID AND                                                                                                                                                                                                                       
      u.name LIKE '%search_terms%'
ORDER BY  
      CASE WHEN um.weight IS NULL THEN 9999 ELSE um.weight END;

如果缺少weight,则可以使用case语句对缺少的{{1}}进行替换。