有没有办法计算MySQL join
结果中的所有列?
我已经看到有一种方法可以在单个表的select
上进行,但我没有弄清楚如何使用join进行此操作。
答案 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
表描述了系统中的所有表。在这里,我们计算表t1
和t2
中的列。这是您从这些表的连接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
但这取决于您的数据库设计,避免对具有不同含义的列使用相同的名称。许多数据库设计都不是这样的。