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

基本的なMySQLクエリ

    http://sqlfiddle.com/#!9/839d2/1でクエリを試すことができます

    クエリ1

    キャプテンがいるすべての惑星のリスト。 id_planet、planet_name、これらの各惑星の総船長、およびそこで行われた戦闘の数(存在する場合)が表示されます。

    SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
    FROM planet AS aa
    INNER JOIN soldier AS bb
    ON aa.id_planet = bb.planet_id
    INNER JOIN (
        SELECT planet_id, COUNT(*) AS captains_count
        FROM soldier
        WHERE rank = 'captain'
        GROUP BY planet_id
    ) AS _aa
    ON aa.id_planet = _aa.planet_id
    LEFT JOIN (
        SELECT id_planet_battle, COUNT(*) AS battles_count
        FROM battle
        GROUP BY id_planet_battle
    ) AS _bb
    ON aa.id_planet = _bb.id_planet_battle
    WHERE bb.rank = 'captain';
    

    これを使用して同じ結果を得ることができます:

    SELECT DISTINCT aa.id_planet, aa.planet_name,
    (
        SELECT COUNT(*)
        FROM soldier AS _aa
        WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
        GROUP BY _aa.planet_id
    ) AS captains_count,
    (
        SELECT COUNT(*)
        FROM battle AS _bb
        WHERE aa.id_planet = _bb.id_planet_battle
        GROUP BY _bb.id_planet_battle 
    ) AS battles_count
    FROM planet AS aa
    INNER JOIN soldier AS bb
    ON aa.id_planet = bb.planet_id
    WHERE bb.rank = 'captain';
    

    クエリ3

    SELECT aa.name, aa.rank, bb.planet_name AS planet_from, (
        SELECT COUNT(*) 
        FROM soldier AS _aa 
        WHERE _aa.planet_id = aa.planet_id
    ) AS number_of_soldiers, 
    (
        SELECT COUNT(*)
        FROM battle AS _bb
        WHERE _bb.id_planet_battle = aa.planet_id
    ) AS number_of_battles
    FROM soldier AS aa
    INNER JOIN planet AS bb
    ON aa.planet_id = bb.id_planet;
    

    ここでは、クエリ1.1で行ったように、結合を使用してnumber_of_soldiersとnumber_of_battlesを計算しませんでした。これは、相関サブクエリであり、外部クエリにアクセスできないためです( https://dev.mysql.com/doc/refman/5.5/en/from-clause -subqueries.html

    間違ったクエリ:

    SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
    FROM planet AS aa
    INNER JOIN soldier AS bb
    ON aa.id_planet = bb.planet_id
    INNER JOIN (
        SELECT COUNT(*) AS captains_count
        FROM soldier AS _aa
        WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
        GROUP BY _aa.planet_id
    ) AS _aa
    ON aa.id_planet = _aa.planet_id
    LEFT JOIN (
        SELECT COUNT(*) AS battles_count
        FROM battle AS _bb
        WHERE aa.id_planet = _bb.id_planet_battle
        GROUP BY _bb.id_planet_battle 
    ) AS _bb
    ON aa.id_planet = _bb.id_planet_battle
    WHERE bb.rank = 'captain';
    

    したがって、上記のクエリは間違っており、エラーが発生します:「where句」の不明な列「aa.id_planet」。

    あなたが尋ねた2番目のクエリについては、他の誰かが試してくれることを願っています。




    1. 2つのフィールドの値が同じであるレコードの作成を防ぐにはどうすればよいですか?

    2. PHPでfalseを返すSQLクエリ

    3. djangoとmysqlがUTF-8で動作するように設定する方法

    4. 売れ筋商品を取得するためのMySQLクエリ