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不喜欢对布尔值求和,所以我用+运算符更新了答案。为什么有这种设计,而不是更规范的设计?