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