ホームページ >バックエンド開発 >PHPチュートリアル >複数の列に対応する 1 つの行に関する MySQL の関連クエリの問題と例と詳細な説明。
テーブルが 2 つあります
t1 テーブルには、id、city_id1、city_id2、city_id3 の 4 つのフィールドがあります
t2 テーブルには、id、city_name の 2 つのフィールドがあります
t1 テーブルの city_id1、2、および 3 は、すべて同じ ID です対応する t2 テーブル
例:
t1 テーブルには 1 つのレコード 1,26,29,50 があります
t2 テーブルには 3 つのレコードがあります
26 北京
29 上海
50 天津
さて、私の要件は次のようになりますSQL文でt1を調べて、city_id1,2,3に該当する都市を表示します 例
結果:1、北京、上海、天津
SQL文はどのように書けばよいでしょうか?ディスカッション (解決策) への返信
select id, (select city_name from t2 where id=t1.city_id1) as city_name1, (select city_name from t2 where id=t1.city_id2) as city_name2, (select city_name from t2 where id=t1.city_id3) as city_name3 from t1
システムの起動時に静的変数にファイルを読み取らせます
この関数は、都市 ID が渡されると、すぐにベースの都市名を返します$city で 静的変数であるため、1 回のリクエストで複数回呼び出すオーバーヘッドはありません。大きな点は、初期化のためにファイルを読み取る必要があることです
これにより、都市に基づいて名前を変換するニーズをすべて解決できますウェブサイトの ID
SQL Bamboo は、別の解決策について話しましょう~
関数を書いて静的変数 $city 配列を定義し、都市 ID をキーとして使用し、都市名を値として使用させます
毎回都市データはバックグラウンドで編集され、シリアル化された都市データのファイルが生成されます
この関数は都市 ID を渡すと、$city に基づいて都市名をすぐに返します
静的変数であるため、1 回のリクエストで複数回呼び出すオーバーヘッドは高くありませんが、初期化にはファイルの読み取りが必要です
これにより、Web サイトで都市 ID に基づいて名前を変換するニーズをすべて解決できます
実際、私は今、バックアップ用にこのような都市配列を毎回見つけて、city_id を渡して都市名を取得します
あなたが言及した方法は、この配列をキャッシュすることと同等であり、非常に優れています
より大きな方法は実装できますが、あまり効率的ではないようです。 mysql はこのマッチング関係を効率的に処理できると考えられていました。それぞれの利点は何ですか?
ひらめき、別のアイデア
都市名を出力する必要がある場合は、まず {CITY:123} の形式で記述します
ページの下部にある ob_get_clean では、正規表現を使用してこれらの情報を見つけ出し、重複する ID を削除し、この非反復 ID のセットに基づいてデータベースをクエリし、名前を置き換えます。このメソッドの消費量はもう少し多くなる可能性があります。 CPU は必要ありませんが、都市に関するデータベースの操作も一度に完了します。最終的には、まだ古い xu の方法を使用しているためです。テーブルは比較的小さいです