来自联接的MySQL列计数

来自联接的MySQL列计数,mysql,join,Mysql,Join,有没有办法计算MySQL中join结果中的所有列? 我已经看到有一种方法可以在从单个表中选择,但我没有弄清楚如何使用join来实现它。您可以在mysql cli中实现它,但这有点像黑客(委婉地说),可能不适合您的要求,我真的无法想象您希望如何使用它 您可以尝试使用PAGER命令,并通过使用LIMIT 1运行查询来计算返回的行数 e、 g.以下联接返回7列 mysql> SELECT * from tuser1 t1 JOIN tuser2 t2 USING(id) limit 1\G **

有没有办法计算MySQL中
join
结果中的所有列?
我已经看到有一种方法可以在
从单个表中选择
,但我没有弄清楚如何使用join来实现它。

您可以在mysql cli中实现它,但这有点像黑客(委婉地说),可能不适合您的要求,我真的无法想象您希望如何使用它

您可以尝试使用PAGER命令,并通过使用LIMIT 1运行查询来计算返回的行数

e、 g.以下联接返回7列

mysql> SELECT * from tuser1 t1 JOIN tuser2 t2 USING(id) limit 1\G
*************************** 1. row ***************************
   id: 15
email: hello
  uid: 2
 enum: 3
email: hello
  uid: 2
 enum: 3
1 row in set (0.00 sec)
将寻呼机设置为计数输出行,返回7

mysql> PAGER grep -v '\*\*' | wc -l;
PAGER set to 'grep -v '\*\*' | wc -l'
mysql> SELECT * from tuser1 t1 JOIN tuser2 t2 USING(id) limit 1\G
7
1 row in set (0.00 sec)

mysql> nopager
PAGER set to stdout

专业提示:避免
选择*
,除非你有很好的理由使用它。首先,它在
JOIN
查询中返回冗余列(在您的例子中,是两个表中的
id
列)。相反,在
SELECT
子句中列出所需列的名称

另一方面,它通常返回的数据比应用程序中需要的数据多。这会连接您的网络,可能还会连接dbms客户机上的RAM

第三,在复杂的查询(如联接)中,dbms有时必须更加努力才能高效地检索所有列。这与覆盖索引之类的内容有关,您可以阅读这些内容

要回答您的问题

您可以使用
information\u模式
获取有关表中列的信息。
表描述了系统中的所有表。这里我们统计表
t1
t2
中的列。如果从这些表的联接中
选择*
,将得到的列数

SELECT COUNT(*), table_name
   FROM information_schema.COLUMNS 
  WHERE table_name IN ('t1', 't2')
    AND table_schema=DATABASE()
  GROUP BY table_name WITH ROLLUP
如果只需要不同名称的列的计数,可以这样做

SELECT COUNT(DISTINCT column_name), table_name
   FROM information_schema.COLUMNS 
  WHERE table_name IN ('t1', 't2')
    AND table_schema=DATABASE()
  GROUP BY table_name WITH ROLLUP

但这取决于您的数据库设计,避免对具有不同含义的列使用相同的名称。许多数据库设计都不是这样。

“…计算所有列…”您要计算列数还是行数?无法计算列数。数数行,你可以做到。