2013-09-30 7 views
6

Ich habe eine Tabelle mit folgendem Schema:Abfrage gibt keine Ergebnisse nur, wenn ORDER BY hinzugefügt

people_stages

id | person_id | stage_id | created 
1  | 1   | 1   | 2013-09-01 00:00:00 
2  | 1   | 2   | 2013-09-02 00:00:00 
3  | 1   | 3   | 2013-09-03 00:00:00 

ich die folgende Abfrage erstellt haben, die letzte Stufe von Person gruppiert auswählen :

SELECT * 
FROM people Person 
LEFT JOIN people_stages PersonStage ON PersonStage.person_id = Person.id 
WHERE PersonStage.created = (SELECT MAX(people_stages.created) FROM people_stages GROUP BY person_id HAVING person_id = PersonStage.person_id); 

Es funktioniert, aber in Ordnung, wenn ich in der Tabelle Person durch ein Feld zu versuchen, um:

SELECT * 
FROM people Person 
LEFT JOIN people_stages PersonStage ON PersonStage.person_id = Person.id 
WHERE PersonStage.created = (SELECT MAX(people_stages.created) FROM people_stages GROUP BY person_id HAVING person_id = PersonStage.person_id) 
ORDER BY Person.last_name; 

Es gibt 0 Ergebnisse zurück.

Könnte jemand bitte Einblick geben?

Danke!

EDIT: Struktur der people

+----------------------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| Field      | Type               | Null | Key | Default | Extra   | 
+----------------------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
| id       | bigint(20)             | NO | PRI | NULL | auto_increment | 
| internal_id    | varchar(50)             | NO | MUL | NULL |    | 
| public_id     | varchar(30)             | NO |  | NULL |    | 
| counselor_id    | bigint(20)             | NO |  | NULL |    | 
| term_id     | int(11)              | NO | MUL | NULL |    | 
| program_id     | int(11)              | NO |  | NULL |    | 
| person_type_id    | int(11)              | NO | MUL | NULL |    | 
| first_name     | varchar(100)             | NO |  | NULL |    | 
| middle_name    | varchar(100)             | NO |  | NULL |    | 
| last_name     | varchar(100)             | NO |  | NULL |    | 
| photo_url     | varchar(255)             | NO |  | NULL |    | 
| gender      | enum('m','f','u')           | NO |  | NULL |    | 
| date_of_birth    | date               | NO |  | NULL |    | 
| address     | varchar(255)             | NO |  | NULL |    | 
| address_apt    | varchar(100)             | NO |  | NULL |    | 
| address_city    | varchar(100)             | NO |  | NULL |    | 
| address_state    | varchar(100)             | NO |  | NULL |    | 
| address_state_intl   | varchar(255)             | NO |  | NULL |    | 
| address_zip    | varchar(25)             | NO |  | NULL |    | 
| address_country   | varchar(100)             | NO |  | NULL |    | 
| address_verified   | tinyint(1)             | NO |  | NULL |    | 
| address_latitude   | varchar(100)             | NO |  | NULL |    | 
| address_longitude   | varchar(100)             | NO |  | NULL |    | 
| address_position   | point              | NO | MUL | NULL |    | 
| address_distance   | smallint(6)             | NO |  | NULL |    | 
| social_facebook   | mediumtext             | NO |  | NULL |    | 
| social_twitter    | varchar(255)             | NO |  | NULL |    | 
| social_instagram   | varchar(255)             | NO |  | NULL |    | 
| phone_cell     | varchar(25)             | NO |  | NULL |    | 
| phone_cell_clean   | varchar(25)             | YES |  | NULL |    | 
| phone_work     | varchar(25)             | NO |  | NULL |    | 
| phone_work_clean   | varchar(25)             | NO |  | NULL |    | 
| permission_to_text   | tinyint(1)             | NO |  | NULL |    | 
| permission_to_text_confirm | tinyint(1)             | NO |  | NULL |    | 
| phone_home     | varchar(25)             | NO |  | NULL |    | 
| phone_home_clean   | varchar(25)             | YES |  | NULL |    | 
| email_address    | varchar(255)             | NO |  | NULL |    | 
| permission_to_email  | tinyint(1)             | NO |  | NULL |    | 
| preferred_contact   | enum('phone_home','phone_cell','text_cell','email','postal') | NO |  | NULL |    | 
| parent_first_name   | varchar(100)             | NO |  | NULL |    | 
| parent_last_name   | varchar(100)             | NO |  | NULL |    | 
| parent_email    | varchar(255)             | NO |  | NULL |    | 
| hs_name     | varchar(255)             | NO |  | NULL |    | 
| hs_homeschooled   | tinyint(1)             | NO |  | NULL |    | 
| hs_ceeb_id     | varchar(100)             | NO |  | NULL |    | 
| hs_grad_year    | varchar(4)             | NO |  | NULL |    | 
| coll_name     | varchar(255)             | NO |  | NULL |    | 
| coll_ceeb_id    | varchar(100)             | NO |  | NULL |    | 
| coll_major     | varchar(255)             | NO |  | NULL |    | 
| coll_year     | varchar(20)             | NO |  | NULL |    | 
| counselor_read    | tinyint(1)             | NO |  | NULL |    | 
| source      | varchar(100)             | NO |  | NULL |    | 
| entry_method    | varchar(100)             | NO |  | NULL |    | 
| erp_processed    | tinyint(1)             | NO |  | NULL |    | 
| created     | datetime              | NO |  | NULL |    | 
| modified     | datetime              | NO |  | NULL |    | 
+----------------------------+--------------------------------------------------------------+------+-----+---------+----------------+ 
+2

verursacht werden könnten Können Sie Tabellenstruktur von tblPeople bieten plz ? –

+0

Sie sicher, dass Sie dieses Feld in Tabellev haben Person.last_name –

+0

Haben Sie versucht, ohne die Tabelle Alias? –

Antwort

3

dies einen Fehler in MySQL zu sein scheint, über die ich filed a report haben. Ich habe es auf den folgenden Testfall verengt, was man erwarten würde, einen einzelnen Datensatz zurückzukehren (aber es funktioniert nicht):

CREATE TABLE t (x INT NULL); -- table with nullable column 
INSERT INTO t VALUES (0); -- but non null data 

SELECT a.x     -- select our nullable column 
FROM  t a, (SELECT NULL) b -- joining it with anything at all 

WHERE EXISTS (   -- but filter on a subquery 
      SELECT * 
      FROM (SELECT NULL) c -- doesn't really matter what 
      HAVING a.x IS NOT NULL -- provided there is some correlated condition 
            -- on our nullable column in the HAVING clause 
     ) 

ORDER BY RAND()    -- then perform a filesort on the outer query 

Sehen Sie es auf sqlfiddle.

In Ihrem Fall können Sie eine Reihe von Dingen tun, dies zu beheben:

  1. als

    die korrelierte Unterabfrage vermeiden durch Umschreiben beitreten:

    SELECT * 
    FROM  people AS p LEFT JOIN (people_stages AS s NATURAL JOIN (
          SELECT person_id, MAX(created) created 
          FROM  people_stages 
          GROUP BY person_id 
         ) t) ON s.person_id = p.id 
    ORDER BY p.last_name 
    
  2. Wenn Sie das behalten wollen korrelierte Unterabfrage (die im Allgemeinen eine schlechte Leistung erbringen kann, aber oft leichter zu verstehen ist), verwenden Sie anstelle von HAVING:

    SELECT * 
    FROM  people AS p LEFT JOIN people_stages AS s ON s.person_id = p.id 
    WHERE s.created = (
          SELECT MAX(created) 
          FROM people_stages 
          WHERE person_id = s.person_id 
         ) 
    ORDER BY p.last_name 
    
  3. Wenn Sie nicht in der Lage sind, die Abfrage zu ändern, sollten Sie, dass die people_stages.person_id Spalte nicht auf NULL festlegbare machen finden, um das Problem zu bekommen:

    ALTER TABLE people_stages MODIFY person_id BIGINT UNSIGNED NOT NULL 
    

    Es scheint, dass auf dieser Spalte einen Index aufweist (was würde erforderlich sein, um einen Fremdschlüssel zu bewirken) kann auch helfen:

    ALTER TABLE people_stages ADD FOREIGN KEY (person_id) REFERENCES people (id) 
    
  4. Alternativ ein people_stages.person_id aus der Auswahlliste entfernen könnte, oder stellen Sie das Datenmodell/Indizierung/Abfrage-Strategie eine filesort zu vermeiden (kann nicht sinnvoll sein in diesem Fall, aber ich erwähne sie hier wegen der Vollständigkeit).

+0

Wo ist der Fehler? EXISTEN (SELECT * FROM (SELECT NULL) c HAVING a.x ist nicht NULL) wird nie existieren. Oder verpasste ich den Punkt? –

+0

@LorenzMeyer: Ein Datensatz, der ein einzelnes 'NULL'-Feld enthält, ist nicht dasselbe wie kein Datensatz. – eggyal

+0

Danke! Das hat mich verrückt gemacht. – Pete

0

Sie sicher, dass Sie nicht in Ihrem Server aus dem Raum laufen ... ja, klingt seltsam, aber ein Verhalten wie das beschrieben von diesem

Verwandte Themen