Announcement

Collapse
No announcement yet.

"Column .. cannot be null" bei SELECT und UNION

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "Column .. cannot be null" bei SELECT und UNION

    Hallo,
    ich führe folgendes SQL-Query aus und bekomme den Error 1048 "Column 'id' cannot be null".
    Ich weiß, es ist ein sehr langes Query, aber wichtig ist eigentlich nur, dass beide getrennt voneinander, also ohne UNION, einwandfrei funktionieren .. Auch, wenn ich die ganzen "MATCH AGAINST"-Anweisungen entweder aus dem SELECT oder dem WEHRE-Bereich rausnehme.
    [highlight=sql](
    SELECT e.id,e.title as title, 'all' as date,
    MIN(ed.begin) as begin,MAX(ed.end) as end ,
    (MATCH(e.title) AGAINST ('')) as score_event,
    (MATCH(a.name) AGAINST ('')) as score_address,
    MAX((MATCH(t.tag) AGAINST (''))) as score_tags,
    (MATCH(c.name) AGAINST ('')) as score_county,
    (MATCH(d.name) AGAINST ('')) as score_district

    FROM events e

    JOIN addresses a ON a.id = e.address_id
    JOIN tags_rels tr ON (tr.entry_id = e.id AND tr.type = 'e')
    JOIN tags t ON t.id = tr.tag_id JOIN counties c ON c.id = a.county_id
    JOIN districts d ON d.id = a.district_id
    JOIN events_dates ed ON (DATE(ed.begin) <= '2012-4-30' AND DATE(ed.end) >= '2012-4-01') AND ed.event_id = e.id

    WHERE e.sedase = 0 AND DATE(end) >= DATE(NOW()) AND e.authorized > 0 AND
    (
    (MATCH(e.title) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(a.name) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(t.tag) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(c.name) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(d.name) AGAINST ('' IN BOOLEAN MODE))
    )
    GROUP BY e.id)

    UNION

    (SELECT e.id,e.title as title, ed.id as date,
    ed.begin as begin,ed.end as end
    ,(MATCH(e.title) AGAINST ('')) as score_event,
    (MATCH(a.name) AGAINST ('')) as score_address,
    MAX((MATCH(t.tag) AGAINST (''))) as score_tags,
    (MATCH(c.name) AGAINST ('')) as score_county,
    (MATCH(d.name) AGAINST ('')) as score_district

    FROM events e

    JOIN addresses a ON a.id = e.address_id
    JOIN tags_rels tr ON (tr.entry_id = e.id AND tr.type = 'e')
    JOIN tags t ON t.id = tr.tag_id JOIN counties c ON c.id = a.county_id
    JOIN districts d ON d.id = a.district_id JOIN events_dates ed ON (DATE(ed.begin) <= '2012-4-30' AND DATE(ed.end) >= '2012-4-01') AND ed.event_id = e.id

    WHERE e.sedase = 1 AND DATE(end) >= DATE(NOW()) AND e.authorized > 0 AND
    (
    (MATCH(e.title) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(a.name) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(t.tag) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(c.name) AGAINST ('' IN BOOLEAN MODE)) OR
    (MATCH(d.name) AGAINST ('' IN BOOLEAN MODE)) )
    )[/highlight]

    Hat jemand eine Idee?

    Vielen Dank.

    Johannes

  • #2
    Idee:
    Ein Union versucht ja eine Eindeutigkeit der Sätze herzustellen, im Gegensatz zu Union All (ich weiß nicht wirklich, wie das bei mySQL läuft)
    Ein Null Wert in der -vermutlich originalen PK Spalte- stört dabei vielleicht.
    Denkbar wäre, dass Match im Kern zwecks Performance/ Eindeutigkeit solche Infos verwendet oder sucht. Logisch notwendig scheint es auf den ersten Blick nicht. Vlt steht dazu auch was in der Doku.
    Denkbar auch, dass allein die Existenz des Null Wertes in der -vermuteten- PK Spalte auf einen fehlerhaften Basis Join hindeutet, was dann einfach nur behoben werden müsste.

    Also entweder Sätze mit Null bestimmen und rausfiltern oder
    Join prüfen und reparieren > keine Null Werte mehr in ID< oder
    direkt auf Union All umstellen oder alles zusammen
    und Verhalten prüfen.
    Gruß, defo

    Comment


    • #3
      Das merkwürdige ist ja: Ich habe alle Primary-Key-Spalten überprüft, sie beinhalten keine NULL-Werte und lassen diese auch nicht zu. Sie sind stets vom Typ "int(11) NOT NULL AUTO_INCREMENT". Auch alle von MATCH AGAINST überprüften Spalten, die logischerweise alle FULLTEXT-Indizes sind, beinhalten keine NULL-Werte.
      UNION mit ALL gibt den gleichen Fehler.

      Comment


      • #4
        Ein "falsches" Selekt bzw Join könnte aber Spalten mit NULL Werten produzieren. Hast Du das auch überprüft?
        Gruß, defo

        Comment


        • #5
          Oh ja, das zweite Statement ergibt eine Zeile nur mit NULL-Werten :/ Oh Gott, könnte mir jemand eine Hilfestellung geben, welches Select/welcher Join da falsch sein könnte? Habe keine Ahnung, wo ich ansetzen soll zu suchen .. Aber vielen Dank erstmal!

          Comment


          • #6
            Du könntest zur Probe im 2. Select erstmal ein "where ID is not null anhängen"?
            Dann weisst Du jedenfalls gleich, ob es nicht ein Holzweg ist.
            Gruß, defo

            Comment


            • #7
              Hi,

              normalerweise müssen in einem Union select die korrespondierenden Spalten
              vom Typ her gleich sein. Ich sehe hier aber 'all' und e.id

              Gruß
              docendo discimus

              Comment


              • #8
                Hi,

                normalerweise müssen in einem Union select die korrespondierenden Spalten
                vom Typ her gleich sein. Ich sehe hier aber 'all' und ed.id *.
                Ist das derselbe Typ?

                Gruß

                * Ich hatte mich vorhin verschrieben. Leider klappt das Editieren bei mir nicht immer. Es rödelt endlos lange herum.
                docendo discimus

                Comment


                • #9
                  @defo: Das habe ich bereits probiert, die Fehlremeldung kommt immer noch. Es wundert mich auch, dass gesagt wird, das Feld "id" darf nicht NULL sein, und nicht "id" mit einem Alias/Tabellennamen davor, weil es ja nicht eindeutig ist. Daher funktioniert "WHERE id IS NOT NULL" genau so wenig wie "WHERE e.id IS NOT NULL" ..

                  @frauwue: Also in der Tat nimmt "date" im ersten Query den String "all" als Wert an und um zweiten einen Integer-Wert, nämlich die ID eines Eintrags mit dem Datum in der Datenbank. Hat das Relevanz? Jedenfalls kommt der Fehler immer noch, wenn ich statt dem "all" einen Integer einsetze ..

                  Comment


                  • #10
                    Die "all" Geschichte ist "unschön", aber vermutlich nicht die Ursache. Das gerade zu rücken schadet aber auch nicht.

                    Letztlich kommst Du nicht drumrum, Dein Join zu bereinigen. Es sollten ja wohl keine frei fliegenden Datensätze entstehen. Hab allerdings auf den ersten Blick keine outer joins entdeckt. Seltsam.

                    Damit das "where .. not null" alles greift, notfalls ein 2.Select um das erste legen. So wird das erste Ergebnis erneut gefiltert, sollte todsicher sein. Ist aber auch nur zu Forschungszwecken geeignet.

                    P.S.: Bist Du Dir sicher, dass die Join und Where Kriterien richtig gesetzt sind?
                    Gruß, defo

                    Comment


                    • #11
                      Ich habe das Problem gefunden: Es liegt an der MAX-Funktion im SELECT. .. "MAX((MATCH(t.tag) AGAINST ('')))" Diese scheint NULL zurückzugeben und erzeugt damit eine "NULL-Zeile". Wie kann ich verhindern, dass die MAX-Funktion NULL ausgibt, und stattdessen einfach "nichts" macht, wenn kein Wert vorhanden ist?
                      Zuletzt editiert von herlos; 23.04.2012, 22:01.

                      Comment


                      • #12
                        Hallo,
                        Originally posted by herlos View Post
                        ...dass die MAX-Funktion NULL ausgibt, und stattdessen einfach "nichts" macht, wenn kein Wert vorhanden ist?
                        Genau das passiert doch mit der Rückgabe von NULL! Die MAX-Funktion liefert dann NULL, wenn entweder kein Wert vorhanden ist oder alle aggregierten Werte NULL sind.
                        Ansonsten solltest du mal erläutern, was es mit "MATCH(t.tag) AGAINST ('')" auf sich hat. Warum lässt man eine Funktion zur Volltextsuche auf ein einzelnes Feld mit einem Leerstring los? Was ist da das erhoffte Ergebnis und warum reicht nicht ein einfacher Vergleich?

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          So vielen Dank an alle!
                          Habe es nun einfach mit COALESCE() gelöst ..

                          Comment

                          Working...
                          X