2011-08-03 3 views
2

私はこの上に私の髪を引っ張る点に近いです。これは私が働いているクエリです:これはMySQLのバグですか、あるいは私は狂っていますか?クエリが十分な結果を返さない

  SELECT 
      *, 
      GROUP_CONCAT(DISTINCT d.title SEPARATOR ', ') AS departments, 
      MAX(d.department_id) AS department_id, 
      CONCAT(friendly_last_name, ', ', friendly_first_name) AS professor_name, 
      IF(p.reviews = 0, "", p.quality) AS quality, 
      IF(p.reviews = 0, "", p.reviews) AS reviews, 
      IF(p.reviews = 0, "", p.ease) AS ease, 
      u.url 
     FROM 
      educational.professors_departments 
      LEFT JOIN educational.professors p USING (professor_id) 
      LEFT JOIN educational.departments d USING (department_id) 
      LEFT JOIN educational.universities u ON (p.university_id = u.university_id) 
     WHERE 
      p.university_id = 3231 
      AND d.department_id IN ('91') 
     GROUP BY 
      professor_id 
     ORDER BY p.friendly_last_name ASC, p.friendly_first_name ASC 

私はそのクエリを実行すると、私は101の結果を取得します。単純なLIMIT 20をクエリの最後に追加すると、突然クエリが1つの結果を返します。

それは十分奇妙ではありませんかのように、私は25を制限するLIMIT 20を変更した場合、私は25件の結果を受け取ります。私がこれについて不足しているいくつかの魔法のことがありますか?私は私の人生のためにそれを理解することはできません。

P.S. - SQL_NO_CACHEを無駄にしようとしました。 P.P.S. - 私はBY句全体ORDERを削除しますが、LIMIT 20のままにした場合...私は20件の結果

+0

のレビュー= 0理論的には全く同じでなければなりません。 –

+0

は、それはあなたが実際には最初の20件の結果かそこらのためにnull値を取得しているし、彼らはあなたのシェル内のテキストとして表示されないか、あなたのシェルから「x行が返された」というメッセージを取得していることは可能ですか? – dfb

+0

SQLYogは "1 row returned"と言っていましたが、これをシェルで実行し、 "1 row in set"という行が1つしかないことを確認してください。 –

答えて

2

を取得し、私は唯一のエンジンは、いくつかの要素に推測するために最善をやっている推測することができます...あなたは私ドンは、加入残っています「tはあなたが本当に欲しいものであると信じて...ちょうどNORMALが参加する...私は最初

...あなたのクエリにEXPLAIN、何それはそれを思い付くことは、インデックス、全表スキャン、などと見識を表示することがあります見てみます

さらに、select *を使用すると、一般的ではない、遅延クエリが発生します。あなたが望み、期待している列を入手してください。構造が変わって*に頼っていると、将来予期せぬ事態になる可能性があります。

私は次のように、再構築の結果を見ると容易さ、品質、レビューのためのあなたのIF()句を見ると

SELECT STRAIGHT_JOIN 
     p.Professor_ID, 
     CONCAT(p.friendly_last_name, ', ', p.friendly_first_name) AS professor_name, 
     GROUP_CONCAT(DISTINCT d.title SEPARATOR ', ') AS departments, 
     MAX(d.department_id) AS department_id, 
     IF(p.reviews = 0, "", p.quality) AS quality, 
     IF(p.reviews = 0, "", p.reviews) AS reviews, 
     IF(p.reviews = 0, "", p.ease) AS ease, 
     u.url 
    FROM 
     educational.professors p 
     JOIN educational.professors_departments pd 
      on p.Professor_ID = pd.Professor_ID 
      JOIN educational.departments d 
       on pd.Department_ID = d.Department_ID 
       AND d.department_id IN ('91') 
     JOIN educational.universities u 
      ON p.university_id = u.university_id 
    WHERE 
     p.university_id = 3231 
    GROUP BY 
     p.professor_id 
    ORDER BY 
     p.friendly_last_name ASC, 
     p.friendly_first_name ASC 
    LIMIT 20 

をEXPLAINを確認...あなたは意図的にのみ、これらの値にする場合にのみpはなっていたでしょう。私はSQLyogのを、使用して同じ結果をシェル内で直接試していないが、SQLyogのはどんな面白いをしない得るすべての3つの要素...または、彼らは価値の各列を表すべきである...

+0

通常のJOINSを試してみました。 SELECT *はデバッグ用に用意されていましたが、私は開発時には使用しませんでした(しかし、詳細に注意を払うことに感謝します)。あなたの質問はうまくいくようです。はい、私はp.reviews = 0を使用しようとしていました.p.reviews = 0の場合、p.qualityとp.easeは関連性がないためです。あなたのクエリがどうなっているのか把握しようとしています。 –

+0

@Colin Morelli、STRAIGHT_JOINは構造化された複雑なクエリに役立つので、とにかく私はそれを打ち明けます。 – DRapp

+0

あなたは天才です...あなたはちょうど私の髪の毛を救ったので、主人公は言うまでもありません。結局のところ、私のクエリの問題(信じているかどうか)は、JOIN節のUSINGとONの違い(他のすべてが変更された、それが差をつけた唯一の部分でした)です。しかし、ベンチマークでより速く実行されたので、再構成されたクエリを使用しました。ありがとうございました。 –