2017-09-20 6 views
1

私はこれまで同様の質問をしましたが、問題はSQLではないと思っていましたので、私はPHPまたはPDOに私の質問を向けました。それはある意味で)。だから、基本的に私のクエリはデータを2回取り出すことです(最後のオブジェクトを除外します)。なぜ私はその理由を発見しようとしていますが、答えを見つけることはできません。かつて私の他の投稿に返信した人は、なぜこれが起こったのか分からなかったので、この質問をPHPコードではなくSQLに集中させることにしました。これは自己判断です。 PHPMYADMINで同じ重複問題がテストされているので、問題はSQL自体にあると思います。進んでいただきありがとうございます。結果が2回取得されましたSQL

Desierd結果:データをretrivingクエリ(ない2回)

サンプルデータ:

INSERT INTO `personal_posts` (`id`, `body`, `posted_at`, `user_id`, `likes`, `postimg`, `topics`) VALUES 
(1, 'post 1', '2017-01-27 00:00:00', 3, 1, NULL, NULL), 
(2, 'post 2, '2017-09-10 00:00:00', 1, 1, NULL, NULL), 

マイクエリ:FROM句の

SELECT personal_posts.id, personal_posts.body, personal_posts.posted_at, personal_posts.postimg, personal_posts.likes, users.`username` FROM users, personal_posts, followers 
      WHERE (personal_posts.user_id = followers.user_id 
      OR personal_posts.user_id = :useridB) 
      AND users.id = personal_posts.user_id 
      AND follower_id = :userid 
      ORDER BY personal_posts.posted_at DESC; 
+1

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。 –

+0

あなたが@ GordonLinoffにリクエストしたものを追加しました – Itsmoloco

+0

いいえ、あなたはしませんでした。 https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-queryを参照してください。 – Strawberry

答えて

0

決して使用コンマ。 常には、適切で明示的なJOIN構文を使用します。すべてのテーブルのデカルト積を最初に生成するようにデータベースに依頼すると、あなたは何を期待していますか?重複が起こりそうです。しかし、

SELECT pp.id, pp.body, pp.posted_at, pp.postimg, pp.likes, u.username 
FROM personal_posts pp JOIN 
    users u 
    ON pp.user_id = u.id JOIN 
    followers f 
    ON pp.user_id = f.user_id 
WHERE f.follower_id = :userid OR pp.user_id = :useridB 
ORDER BY pp.posted_at DESC; 

これは単なる推測です:

は、おそらくこれは、あなたが望むクエリです。それは少なくとも読める。

+0

試していただきありがとうございますが、私にも同じ結果が出ています。 – Itsmoloco

0

レコードが重複している場合は、すべてのテーブルのすべての列を追加して重複箇所を確認することがあります。だから、あなたは(ゴードン・リノフの回答に基づいて)このようなクエリを試すことができます。

SELECT 'pp', 
pp.*, 
'u', 
u.*, 
'f', 
f.* 
FROM personal_posts pp 
JOIN users u ON pp.user_id = u.id 
JOIN followers f ON pp.user_id = f.user_id 
WHERE f.follower_id = :userid OR pp.user_id = :useridB 
ORDER BY pp.posted_at DESC; 

つのテーブルが終わるとどこがあなたの結果で見ることができるように(私は「PP」と引用符の他のフィールドを追加しました別のテーブルが開始されます)。

多くの結果が得られるはずですが、レコードが異なる場所を表示する必要があります。これは、欠落している結合条件またはWHERE節を示します。

これは最終的なクエリではありませんが、問題の発見に役立ちます。

+0

あなたの助けてくれてありがとう、私はSQLを新しくしました。重複した結果、IDとfollower_idには2つの違いがあります(次の画像https://ibb.co/kLtg9Q参照)。 ? – Itsmoloco

関連する問題