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

时间:2013-03-21 01:13:11

标签: 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 | 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

Ex:我想找到周日上午9点和上午11点,周一上午10点和上午11点以及周二上午9点的所有身份证,然后点击次数最多

我会得到以下回复。

  • A 4 Hits
  • B 2次点击
  • C 2次点击

1 个答案:

答案 0 :(得分:0)

首先,让我们得到一个查询,将数据按摩到更容易使用的东西:

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

SQL Fiddle example of the data this returns

然后你可以从这个(派生的)表中选择:

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

SQL Fiddle example

请注意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