MySQL:获取设置了最多列数的前30行
我有一个具有以下模式的表:MySQL:获取设置了最多列数的前30行,mysql,Mysql,我有一个具有以下模式的表: user_id | A | B | C | D | E | F | G | H | I | J | K | L | M ------------------------------------------------------------ 3829 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 列A-M有布尔值,显然是0或1 除了循环遍历所有列之外,还有什么方法可以: 获取特定用户设置为1的列数,以及
user_id | A | B | C | D | E | F | G | H | I | J | K | L | M
------------------------------------------------------------
3829 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1
列A-M有布尔值,显然是0或1
除了循环遍历所有列之外,还有什么方法可以:
获取特定用户设置为1的列数,以及
将列数最多的前30名或前n名用户设置为1?
我对php和MySQL有相当多的经验,但是像这样的查询让我感到困惑
我正在设想这样的事情:
$statement = "SELECT * FROM my_table WHERE count(*) > 1 ORDER BY DESC LIMIT 30";
任何帮助都很好:这可以通过添加布尔值和FROM来实现 由于bool是以位的形式存储的,所以可以使用sum来获取每行的运行总数。 使用此数据,然后获得具有最高值的前n个结果。 大概是这样的:
SELECT * FROM (
SELECT *, A + B + C + D + E + F + G + H + I + J + K + L + M AS Total
FROM Table1
)
ORDER BY Total DESC
LIMIT 30;
SELECT *, A + B + C + D + E + F + G + H + I + J + K + L + M AS Total
FROM Table1
ORDER BY Total DESC
LIMIT 30;
或者,如果不想使用子查询,则由于使用了聚合和函数,因此必须使用group by
更新:由于我不再使用SUM函数,因此第二个函数中的group by不再需要,因此我也删除了它
大概是这样的:
SELECT * FROM (
SELECT *, A + B + C + D + E + F + G + H + I + J + K + L + M AS Total
FROM Table1
)
ORDER BY Total DESC
LIMIT 30;
SELECT *, A + B + C + D + E + F + G + H + I + J + K + L + M AS Total
FROM Table1
ORDER BY Total DESC
LIMIT 30;
您也可以使用加号+作为总和
逻辑很简单,您只需按照所有其他数值列总和的降序对数据进行排序,然后获取前30个。这将使你进入前30名。这是很棘手的,因为不需要进行聚合,所以在这里使用sum函数是不正确的。因此,您的查询应该是:
SELECT *
FROM Table1
ORDER BY (A + B + C + D + F + G + H + I + J + K + L + M) DESC
LIMIT 30;
这里有一个是的,我混合了我的SQL语法,它的限制不是最高的。。。我已经修复了它。@Sej它还表明MySql不喜欢对布尔值求和,所以我用+运算符更新了答案。为什么有这种设计,而不是更规范的设计?