これは一種のハックであり、結合ではありませんが、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 |
+--------|-----+
少なくとも私の使用例では、これにより 2 つのクエリがすばやく結合され、出力が結合と同等になり、必要なツールに出力をパイプできます。
あるクエリの id リストは、他のクエリのクエリ テキストになることに注意してください。この方法であまりにも多くのデータを「結合」すると、OS によってクエリの長さが制限される場合があります ( https://serverfault.com/a/163390 )。したがって、これは非常に大規模なデータセットには不十分なソリューションであることに注意してください。pymysql のような mysql ライブラリで同じことを行うと、この制限を回避できることがわかりました。