sql >> データベース >  >> RDS >> Mysql

MySql。セルフジョインの使い方

    あなたはとても近いです!

    Aから国と年を表示し、A. Country トルコの、トルコはあなたが見るつもりのすべてです。選択をB.countryに変更する必要があります およびB.year または、where句をB.countryに変更します 。

    これはクロス結合を使用しているため、テーブルにあるレコードが多いほど遅くなります。

    SELECT DISTINCT b.Country, b.Year 
    FROM table1 AS a, 
         table1 AS b 
    WHERE a.Year=b.Year 
      and a.Country='Turkey';
    

    ...と書くことができ、同じ実行計画を持つ可能性があります。

    SELECT DISTINCT b.Country, b.Year 
    FROM table1 AS a 
    CROSS JOIN table1 AS b 
    WHERE a.Year=b.Year 
      and a.Country='Turkey';
    

    またはこれは、エンジンが実行する必要のある作業を制限し、クロス結合のようなパフォーマンスの低下に悩まされない内部結合を使用します。

    SELECT DISTINCT a.Country, a.Year 
    FROM table1 AS a 
    INNER JOIN table1 AS b 
       on a.Year=b.Year 
      and b.Country='Turkey';
    

    理由:

    結合が発生したときにSQLエンジンが何をするかを検討してくださいAB

    +------------+------+--------+------------+------+--------+
    | A.Country  | Rank |  Year  | B.Country  | Rank |  Year  |
    +------------+------+--------+------------+------+--------+
    |France      |  55  |  2000  |France      |  55  |  2000  |
    +------------+------+--------+------------+------+--------+
    |Canada      |  30  |  2000  |France      |  55  |  2000  |
    +------------+------+--------+------------+------+--------+ 
    |Turkey      |  78  |  2000  |France      |  55  |  2000  |
    +------------+------+--------+------------+------+--------+ 
    |France      |  55  |  2000  |Canada      |  30  |  2000  |
    +------------+------+--------+------------+------+--------+
    |Canada      |  30  |  2000  |Canada      |  30  |  2000  |
    +------------+------+--------+------------+------+--------+ 
    |Turkey      |  78  |  2000  |Canada      |  30  |  2000  |
    +------------+------+--------+------------+------+--------+ 
    |France      |  55  |  2000  |Turkey      |  78  |  2000  |
    +------------+------+--------+------------+------+--------+
    |Canada      |  30  |  2000  |Turkey      |  78  |  2000  |
    +------------+------+--------+------------+------+--------+ 
    |Turkey      |  78  |  2000  |Turkey      |  78  |  2000  |
    +------------+------+--------+------------+------+--------+ 
    

    つまり、A.Countryを表示すると言ったとき およびA.Year ここで、A.Country はトルコです、あなたはそれが返すことができるすべてがトルコであることがわかります(明確な唯一のレコードのため)

    ただし、B.Countryを実行する場合 はトルコで、A.Countryを表示します 、フランス、カナダ、トルコを取得します!



    1. キー->値データ用の優れた高速永続ストレージオプションは何ですか?

    2. 一意性の制約を処理するためにSQLiteUPDATEでORDERBYをシミュレートします

    3. GUIを使用してMySQLWorkbenchでステータスとシステム変数を表示する方法

    4. Mysqlを使用して中央値を計算する