Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 尝试从多个表和列中选择所有ID,并按最匹配项排序_Mysql - Fatal编程技术网

Mysql 尝试从多个表和列中选择所有ID,并按最匹配项排序

Mysql 尝试从多个表和列中选择所有ID,并按最匹配项排序,mysql,Mysql,我要做的是选择所有匹配最多的ID,并按点击次数最多的顺序列出它们 TABLE - SUNDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 1 | 0 | 0 B | 0 | 0 | 1 | 1 C | 0 | 0 | 0 | 1 TABLE - MONDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 0 | 1 | 1 B | 0 | 1 | 0 | 0 C | 0

我要做的是选择所有匹配最多的ID,并按点击次数最多的顺序列出它们

TABLE - SUNDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 1 | 0 | 0 B | 0 | 0 | 1 | 1 C | 0 | 0 | 0 | 1 TABLE - MONDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 0 | 1 | 1 B | 0 | 1 | 0 | 0 C | 0 | 0 | 0 | 1 TABLE - TUESDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 1 | 0 | 0 B | 0 | 1 | 0 | 0 C | 0 | 0 | 0 | 1 我想找到所有周日上午9点和11点、周一上午10点和11点以及周二上午9点的ID,然后按点击率最高的顺序订购

TABLE - SUNDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 1 | 0 | 0 B | 0 | 0 | 1 | 1 C | 0 | 0 | 0 | 1 TABLE - MONDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 0 | 1 | 1 B | 0 | 1 | 0 | 0 C | 0 | 0 | 0 | 1 TABLE - TUESDAY ID | 8AM | 9AM | 10AM | 11AM A | 0 | 1 | 0 | 0 B | 0 | 1 | 0 | 0 C | 0 | 0 | 0 | 1 我将得到以下返回

四支安打 B 2支安打 C2命中率
首先,让我们获取一个查询,将数据转换为更易于处理的内容:

SELECT ID, 0 AS dow, 8 as hr, `8AM` AS hits
FROM SUNDAY
UNION ALL
SELECT ID, 0 AS dow, 9 as hr, `9AM` AS hits
FROM SUNDAY
UNION ALL
SELECT ID, 0 AS dow, 10 as hr, `10AM` AS hits
FROM SUNDAY
UNION ALL
SELECT ID, 0 AS dow, 11 as hr, `11AM` AS hits
FROM SUNDAY
UNION ALL
SELECT ID, 1 AS dow, 8 as hr, `8AM` AS hits
FROM MONDAY
UNION ALL
SELECT ID, 1 AS dow, 9 as hr, `9AM` AS hits
FROM MONDAY
UNION ALL
SELECT ID, 1 AS dow, 10 as hr, `10AM` AS hits
FROM MONDAY
UNION ALL
SELECT ID, 1 AS dow, 11 as hr, `11AM` AS hits
FROM MONDAY
UNION ALL
SELECT ID, 2 AS dow, 8 as hr, `8AM` AS hits
FROM TUESDAY
UNION ALL
SELECT ID, 2 AS dow, 9 as hr, `9AM` AS hits
FROM TUESDAY
UNION ALL
SELECT ID, 2 AS dow, 10 as hr, `10AM` AS hits
FROM TUESDAY
UNION ALL
SELECT ID, 2 AS dow, 11 as hr, `11AM` AS hits
FROM TUESDAY
然后,您可以从该派生表中选择:

SELECT ID, SUM(hits) AS hits
FROM
(
    --above query, either as a view or derived table
    --or permanently changed
) hitsTable
WHERE (dow = 0 AND hr IN (9,11))
OR (dow = 1 AND hr IN (10,11))
OR (dow = 2 AND hr = 9)
GROUP BY ID
ORDER BY SUM(hits) DESC
注意此处WHERE子句的简单性。如果您可以控制您的模式,我建议您永久性地更改将数据存储为此格式的方式。这会让你的生活更轻松。如果不能,我建议至少创建一个以这种方式组合所有表的视图,以便可以轻松地查询它们

你能用你当前的模式吗?当然,它可能看起来更短或更简单,但如果您动态构建这些查询,它就不那么漂亮了:

SELECT ID, SUM(hits) AS hits
FROM
(
    SELECT ID, `9AM` + `11AM` AS hits
    FROM SUNDAY
    UNION ALL
    SELECT ID, `10AM` + `11AM` AS hits
    FROM MONDAY
    UNION ALL
    SELECT ID, `9AM` AS hits
    FROM TUESDAY
) x
GROUP BY ID
ORDER BY SUM(hits) DESC

事实上,我有控制权,而且我刚刚开始把这些放在一起。我想把它全部放在一个表中,但不知道我可以/应该使用多少列。显然,这是整整一周的时间,总共有106列。顺便说一句,谢谢您的快速回复。@user2138263这正是我所想的。这样,您只需要担心四个列,并且可以非常轻松地进行聚合。如果您将ID和每次点击的时间存储为时间戳,您实际上可以将其缩减为两列,但如果您计划执行大量此类查询,则添加hour/dow列并为其编制索引可能会有好处。第二个版本正在运行。问题是,它只是在查找列中的任何数据,还是查找1或0?@user2138263在您的示例数据之后,它将值相加