Php Mysql按找到的行数排序

Php Mysql按找到的行数排序,php,mysql,Php,Mysql,我使用的是Mysql 5.5.40。 假设我有一个用户配置文件页面,一些用户只需填写两个详细信息(用户名、年龄),而另一些用户的配置文件中可能包含完整的所有字段。因此,我想查询mysql并显示所有用户,但索引那些在顶部填写了最多详细信息的用户。我可以用PHP实现这一点,但我正在尝试找到一个mysql解决方案 PHP示例。 您可以看到这段代码有多麻烦,但它确实完成了这项工作,我想知道是否有mysql的替代方案。考虑到空列的值为NULL,您可以使用函数完成这项工作 SELECT username,

我使用的是Mysql 5.5.40。 假设我有一个用户配置文件页面,一些用户只需填写两个详细信息(用户名、年龄),而另一些用户的配置文件中可能包含完整的所有字段。因此,我想查询mysql并显示所有用户,但索引那些在顶部填写了最多详细信息的用户。我可以用PHP实现这一点,但我正在尝试找到一个mysql解决方案

PHP示例。
您可以看到这段代码有多麻烦,但它确实完成了这项工作,我想知道是否有mysql的替代方案。

考虑到空列的值为NULL,您可以使用函数完成这项工作

SELECT username, age,
((username IS NULL) + (age IS NULL)) AS empty_count 
FROM users 
WHERE 1 
ORDER BY empty_count;
为NULL
将返回
1
如果字段值为NULL,否则将返回
0

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

类似这样:
(如果(用户名“”,0,1)+IF(年龄0,0,1))


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

考虑到空列的值为空,您可以使用函数完成更新

SELECT username, age,
((username IS NULL) + (age IS NULL)) AS empty_count 
FROM users 
WHERE 1 
ORDER BY empty_count;
为NULL
将返回
1
如果字段值为NULL,否则将返回
0

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

类似这样:
(如果(用户名“”,0,1)+IF(年龄0,0,1))


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

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

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

这是你的问题。这不是一个优雅的解决方案,但它是有效的

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

您说您的详细信息存储在各个列中,“未填写”的定义对于每个列都可能不同。该声明将处理许多不同的情况:

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
得分
将导致总数介于0和3之间<如果不是空字符串,
foo
将计入分数,
bar
将计入分数,
numval
将计入分数(如果不是零)


请注意,MySQL中还有一个
IF
语句,但是,如果您希望SQL代码能够移植到其他数据库,那么您应该坚持使用
CASE

您说您的详细信息存储在列中,并且每个列的“not filled in”定义可能不同。该声明将处理许多不同的情况:

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
得分
将导致总数介于0和3之间<如果不是空字符串,
foo
将计入分数,
bar
将计入分数,
numval
将计入分数(如果不是零)


请注意,MySQL中还有一个
IF
语句,但是,如果您希望SQL代码能够移植到其他数据库,则应坚持使用
CASE

假设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

假设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

这取决于MySQL表的结构。如果我们能看到这一点,那将很有帮助。您能否更新您的问题以包含这些信息。这取决于MySQL表的结构。如果我们能看到这一点,那将很有帮助。您能否更新您的问题以包含该信息。遗憾的是,有些字段将null存储为
0
'
,因此这没有帮助。在此之前,我应该使用更好的数据类型来更新我的答案,以解决您的问题。遗憾的是,有些字段将null存储为
0
'
,因此这没有帮助。在此之前,我应该使用更好的数据类型来更新我的答案以解决您的问题。这似乎是一个很好的解决方案,因为我也熟悉
LENGTH()
函数,但有点混乱,就像我的php解决方案一样。这似乎是一个很好的解决方案,因为我也熟悉
LENGTH()
函数,但是有点混乱,就像我的php解决方案一样。所有的,
+1
都是好的答案,但是我必须使用这个。现在就试一下。所有的,
+1
都是好的答案,但我不得不选择这个。现在就试试看。