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