-1

「ユーザー」と「投稿」の 2 つのテーブルがあります。posts テーブルには、「post」列と「poster_id」列があります。次のように、全員による最新の投稿を表示する PHP ページに取り組んでいます。

SELECT * FROM posts WHERE id < '$whatever' LIMIT 10

このようにして、次のように各結果を印刷できます。

id: 43, poster_id:'4', post: hello, world
id: 44, poster_id:'4', post: hello, ward
id: 45, poster_id:'5', post: oh hi!
etc...

ID の代わりに、ポスターの名前を表示したいと思います (「users」テーブルに列があります)。

私は次のことを試しました:

SELECT * 
FROM posts 
WHERE id < '$whatever' 
       INNER JOIN users 
           ON posts.poster_id = users.id LIMIT 10

これは、このタスクの正しいタイプの結合ですか? 結合について学習する前に、投稿結果ごとに users テーブルをクエリします。結果は次のようになります。

id: 43, poster_id:'4', name:'foo', post: hello, world
id: 44, poster_id:'4', name:'foo', post: hello, ward
id: 45, poster_id:'5', name:'fee', post: oh hi!
etc...

事前にご協力いただきありがとうございます。

4

4 に答える 4

4

WHERE句は、句の後に来る必要がありますFROM

SELECT  posts.*, users.*   // select your desired columns
FROM    posts 
        INNER JOIN users ON posts.poster_id = users.id 
WHERE   id < '$whatever'
LIMIT   10

操作の SQL 順序は次のとおりです。

  • FROM 句
  • WHERE句
  • GROUP BY 句
  • HAVING 句
  • SELECT句
  • ORDER BY 句

更新 1

両方のテーブルに存在する列名については、それらに を追加しALIASて、一意に識別できるようにします。例、

SELECT  post.colName as PostCol, 
        users.colName as UserCol, ....
FROM ....

上記の例では、両方のテーブルに列名がありますcolName。両方を取得するには、それらにエイリアスを追加する必要があるため、フロントエンドで and を使用PostColUserColてそれらの値を取得します。

于 2013-02-10T10:35:35.207 に答える
2

試す:

SELECT *
FROM posts
INNER JOIN users ON posts.poster_id = users.id
WHERE posts.id < '$whatever'
LIMIT 10
于 2013-02-10T10:36:00.843 に答える
0

すでに与えられた回答は、クエリがまったく機能しない主な理由を示しています (つまり、WHERE句は句の後に来る必要がありますJOIN)。ただし、追加の点をいくつか述べたいと思います。

  • これには を使用することをお勧めしOUTER JOINます。おそらく大きな違いはありませんが、ポスト レコードに無効なposter_idがある場合、INNER JOINはレコードが結果から削除されるOUTER JOINことを意味し、 はレコードが含まれることを意味しますが、usersテーブルの値はnull. テーブルに無効なデータを保持したくないと思いますがposter_idpostsデータの破損は、規制が最も厳しいシステムでも発生します。このような場合でも、クエリからデータを取得することは役に立ちます。

  • SELECT *を実行せず、代わりにクエリから取得したいフィールドを箇条書きにすることを強くお勧めします。SELECT *には多くの問題がありますが、クエリに複数のテーブルがある場合は特に問題です。両方のテーブルに同じ名前のフィールドがある場合 (例: id)、どちらを使用しているかを区別するのが非常に難しくなるからです。 、PHP レコードセットにはテーブル参照が含まれないためです。フィールドを項目化すると、クエリ文字列が長くなる可能性がありますが、遅くなることはありません - どちらかといえば速くなります - そして、長期的には扱いやすくなります.

これらの点はどちらも必須ではありません。WHEREクエリはそれらがなくても機能しますが (句を の後に切り替える限りJOIN)、クエリが改善される可能性があり、できれば SQL の理解も向上する可能性があります。

于 2013-02-10T11:08:37.863 に答える
0

構文が少し間違っています。

する必要があります

SELECT * FROM posts
INNER JOIN users ON posts.poster_id = users.id
WHERE id < '$whatever' LIMIT 10
于 2013-02-10T10:36:38.457 に答える