【问题标题】:How to retrieve top 5 values from each column of each of the table of same database and then get over all top 5 in the whole database如何从同一数据库的每个表的每一列中检索前 5 个值,然后获取整个数据库中的所有前 5 个值
【发布时间】:2015-12-27 10:25:47
【问题描述】:

我有一个包含 2000 个表的数据库,随着每个表代表一个用户,它们似乎在增加。所以所有表的结构都是相同的。

我想获得前 5 个值 例如,如果我们采用列 -> OS(操作系统) 然后 查询应该从每个表中获取前 5 个操作系统名称及其计数,最后我应该得到所有表的总和结果,以获得所有数据库表中的前 5 个操作系统名称。

怎么做?

我只能使用 PHP 和 MySQL

我已从所有表中获取相同的列,但无法访问存储在其中的值..

SELECT `COLUMN_NAME` FROM INFORMATION_SCHEMA.columns WHERE TABLE_SCHEMA='database_name' AND COLUMN_NAME = 'os'

【问题讨论】:

  • 究竟为什么需要每个用户拥有一张桌子?这是一个非常糟糕的架构,我无法想象它会有什么有用的场景。
  • 我知道,但只有这样,你能提出一些建议吗?
  • 这是用mysqlsql-server 标记的,但您写的是“仅限PHP 和MySQL”...请清除RDBMS(产品和版本)!您发布的 SELECT ... FROM INFORMATION_SCHEMA ... 看起来像 SQL Server...
  • @Shnugo 我有一个 MYSQL 数据库 -_-
  • 2000 多张桌子!哇 - 您需要紧急重新设计您的架构。一个用户表和其他表,通过键链接到用户表是正确结构化数据库的一般基础 - RDBMS 中的 R 代表 relational 毕竟

标签: php mysql database


【解决方案1】:

您的设计确实应该更改,但这是在 MySql 中执行此操作的一种方法。测试一下in this Fiddle

create table test(os int);
insert into test SELECT 1 UNION SELECT 2 UNION SELECT 3;

create table test2(os int);
insert into test2 SELECT 11 UNION SELECT 12 UNION SELECT 13;

create table test3(os int);
insert into test3 SELECT 21 UNION SELECT 22 UNION SELECT 23;

create table testOtherColumn(Other int);
insert into testOtherColumn SELECT 101 UNION SELECT 102 UNION SELECT 103;

set @MyCmd=
concat(
(
  select substr(group_concat(' UNION SELECT ',c.COLUMN_NAME,' FROM ',c.TABLE_NAME SEPARATOR ''),8) 
  from information_schema.columns as c
  where c.COLUMN_NAME='os'
),';');

select @MyCmd;

PREPARE MyStatement FROM @MyCmd;
EXECUTE MyStatement;
DEALLOCATE PREPARE myStatement;

您将需要某种排序和LIMIT x 和聚合来实现您的目标。我只是不太了解您的表格结构...

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多