这是一种 hack,它不是连接,但我使用 bash 函数让它感觉就像我在做跨服务器查询:
显式版本:
tb2lst(){
echo -n "("
tail -n +2 - | paste -sd, | tr -d "\n"
echo ")"
}
id_list=$(mysql -h'db_a.hostname' -ume -p'ass' -e "SELECT id FROM foo;" | tb2lst)
mysql -h'db_b.hostname' -ume -p'ass' -e "SELECT * FROM bar WHERE foo_id IN $id_list"
+--------|-----+
| foo_id | val |
+--------|-----+
| 1 | 3 |
| 2 | 4 |
+--------|-----+
我写了一些包装函数,我保存在我的 bashrc 中,所以我认为它只是一个命令:
db_b "SELECT * FROM bar WHERE foo_id IN $(db_a "SELECT id FROM foo;" | tb2lst);"
+--------|-----+
| foo_id | val |
+--------|-----+
| 1 | 3 |
| 2 | 4 |
+--------|-----+
至少对于我的用例,这将两个查询拼接在一起的速度足够快,以至于输出等同于连接,然后我可以将输出通过管道传输到需要它的任何工具中。
请记住,一个查询中的 id 列表最终会作为另一个查询中的查询文本。如果您以这种方式“加入”太多数据,您的操作系统可能会限制查询的长度 ( https://serverfault.com/a/163390 )。所以请注意,对于非常大的数据集,这不是一个糟糕的解决方案。我发现用 pymysql 之类的 mysql 库做同样的事情可以解决这个限制。