来自联接

时间:2018-04-20 20:59:12

标签: mysql join

有没有办法计算MySQL join结果中的所有列? 我已经看到有一种方法可以在单个表的select上进行,但我没有弄清楚如何使用join进行此操作。

2 个答案:

答案 0 :(得分:0)

你可以在mysql cli中做到这一点,但它有点像黑客(说得客气一点),可能不符合你的要求,我真的不能想你怎么做想要用它。

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

e.g。以下JOIN返回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)

设置PAGER以计算输出线,返回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

答案 1 :(得分:0)

专家提示:除非您有充分的理由使用它,否则请避免使用SELECT *。首先,它返回JOIN个查询的冗余列(在您的情况下,两个表中的id列)。而是在SELECT子句中列出所需列的名称。

另一方面,它通常会返回比您在应用程序中所需的数据更多的数据。这会占用您的网络,也可能是您的dbms客户端上的RAM。

第三件事,在像JOIN这样的复杂查询中,dbms有时必须更加努力地有效地检索所有列。这与覆盖索引等内容有关,您可以阅读。

回答您的问题

您可以使用information_schema获取有关表中列的信息。 COLUMNS表描述了系统中的所有表。在这里,我们计算表t1t2中的列。这是您从这些表的连接SELECT *获得的列数。

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

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

相关问题