SELECT
p.id,
p.user,
SUM(v.type * 2 - 1) AS votecount
FROM posts p
LEFT JOIN votes v ON p.id = v.postID
WHERE p.user = 'tim'
GROUP BY p.id, p.user
ORDER BY votes DESC
UPDATEからp
とv
について説明します。このクエリで
、p
とv
はエイリアスそれぞれの、posts
とvotes
あります。エイリアスは本質的に代替名であり、それを宣言するステートメント(この場合はSELECTステートメント)のスコープ内でのみ定義されます。テーブルにはエイリアスだけでなく、カラムも設定できます。このクエリでは、votecount
はSUM(v.type * 2 - 1)
式で表される列のエイリアスです。しかし、現在私たちはテーブルについてしか話していません。
テーブルエイリアスについて説明する前に、なぜid
ではなく、posts.id
のようにテーブル名にプレフィックスを付ける必要があるのかを簡単に説明します。基本的に、クエリが複数のテーブルを参照する場合、この場合のように、常にカラム名にそれぞれのテーブル名を接頭辞として付けることは非常に便利です。こうすることで、古いスクリプトを再訪しているときに、参照されているテーブルの構造を調べなくても、どのカラムがどのテーブルに属しているかをいつでも知ることができます。またそれはである必要があります。テーブル参照を含めると、それが省略されたときに、そのテーブルが属するテーブルが不明確になります。 (この場合、各テーブルには、自分のid
を持っているので、曖昧な状況を作り出すんposts
テーブルを参照せずid
列を参照。)
は今、大規模で複雑なクエリは、完全書き出す際に読み取ることが難しいかもしれ列名の前にテーブル名。これは、(短い)エイリアスが便利なところです:質問は読みやすく理解しやすくなりますが、私はすでにすべての人がその意見を共有しているわけではないことを学んだので、あなた自身で判断する必要があります。this questionは同じ長い名前のテーブル参照を持つものと短いものを付けたものの1つと、エイリアスが適切でない理由(回答の1つのコメントの中での意見)があります。
とにかく、この特定のクエリで短いテーブルエイリアスを使用すると、より複雑なステートメントほど有益ではない場合があります。クエリが複数を参照するときはいつもテーブルのエイリアシングに慣れています。
This MySQL documentation articleには、MySQLのエイリアステーブルの公式構文が含まれています(実際には標準SQLと同じです)。
、ティムの最初のポスト( 'idが= 0 ')2 upvotesと1つのdownvoteを持っているので、それはので、彼の第2のポスト(' idは= 1')いずれかの票を持っていませんが、スコアは1です。スコアはゼロです。したがって、これらが選択されている場合( 'SELECT * FROM posts WHERE user = 'tim' ORDER BY DESC')、投稿テーブルに新しいフィールドを追加せずに何らかの方法でスコアを並べることができます。 –
Tomas