按行数找到Mysql顺序

时间:2015-02-26 18:32:32

标签: php mysql

我正在使用Mysql 5.5.40。 假设我有一个用户个人资料页面,有些用户只需填写两个详细信息(用户名,年龄),其他用户可能已完成其个人资料中的所有字段。所以,我想查询mysql并显示所有用户,但索引在顶部填充了最多详细信息的用户。我可以用PHP做到这一点,但我试图找到一个mysql解决方案。

PHP示例。

$result = $db->query("SELECT * FROM users"); 

foreach($result as $row){
  if(count($row) > 10){
      echo $row['username'];
    }elseif(count($row) > 9){
       echo $row['username'];
   }
}

你可以看到这段代码有多繁琐,但它确实完成了工作,我想知道是否有一个mysql替代品。

4 个答案:

答案 0 :(得分:2)

考虑到您的列为空的NULL值,您可以使用IS NULL函数来完成它。

SELECT username, age,
((username IS NULL) + (age IS NULL)) AS empty_count 
FROM users 
WHERE 1 
ORDER BY empty_count;
如果字段的值为NULL,

IS NULL将返回1,否则它将返回0

如果默认情况下您的值不为空,则可以使用IF

这样的事情:(IF(username <> '', 0, 1) + IF(age <> 0, 0, 1))

虽然我认为会更好,但如果您可以跟踪用户输入的字段数并将其存储在单独列中的表中。您必须跟踪每个更新的字段。

答案 1 :(得分:2)

您说您的详细信息存储在列中,每列的“未填写”的定义可能不同。 CASE声明将应对许多不同的情况:

SELECT
   id, 
   CASE WHEN foo IS NULL THEN 0 ELSE 1 END +
   CASE WHEN bar = '' THEN 0 ELSE 1 END +
   CASE WHEN numval = 0 THEN 0 ELSE 1 END AS score
FROM
   users
ORDER BY score

score将导致总数介于0和3之间。foo将计入分数,如果它不为空,bar将计入分数,如果它不是空字符串,如果分数不为零,numval将计入分数。

请注意,MySQL中还有一个IF语句,但是it's a non-standard MySQL extension,因此如果您希望将SQL代码移植到其他数据库,则应该坚持使用CASE

答案 2 :(得分:1)

这是您的查询。它不是一个优雅的解决方案,但它有效。

  SELECT * 
    FROM users
ORDER BY   (LENGTH(column1) > 0) 
         + (LENGTH(column2) > 0)
         + (LENGTH(column3) > 0)
         [...]
   DESC

答案 3 :(得分:1)

假设str_field1是字符串字段,num_field2是数字字段。然后:

SELECT
    username,
    age,
    (str_field1 IS NOT NULL AND str_field1 != '') + 
    (num_field2 IS NOT NULL AND num_field2 != 0) + 
    (str_field3 IS NOT NULL AND str_field3 != '') AS weight
FROM users
ORDER BY weight DESC