Markus: SUBSTR in (My)SQL Query verhält sich merkwürdig

Hallo Forum!

Folgendes Query liefert mir genau das gewünschte Resultat:

  
SELECT CONCAT( SUBSTRING( message, 1, 20 ) , "..." ) AS head, messages.`read` , messages.msgid, messages.`from` , messages.sentdate, user.name, user.gender, (  
YEAR( CURDATE( ) ) - YEAR( user.age )  
) - ( RIGHT( CURDATE( ) , 5 ) < RIGHT( user.age, 5 ) ) AS ageinyears, namelist.newname, block.id AS bid  
FROM messages  
LEFT JOIN user ON messages.`from` = user.id  
LEFT JOIN namelist ON user.id = namelist.`rename`  
LEFT JOIN block ON block.block != user.id AND block.id = '{USER_ID}'  
WHERE messages.`to` = '{USER_ID}'  
AND messages.rdelete = '0'  
AND messages.sentdate + INTERVAL 20  
DAY > NOW( )  
ORDER BY messages.sentdate DESC  
LIMIT 0 , 10  

schränke ich hier jedoch nun mit GROUP BY messages.msgid die Ergebnismenge ein, werden im Feld "head" also dem substring mit den angehängten "..." nur noch soviele Zeichen angezeigt wie in den "" des CONCAT angegeben werden. Ganz gleich welche.
Selbiges passiert wenn ich der WHERE Klausel ein nötiges block.block IS NOT NULL hinzufüge.
Lasse ich das CONCAT aus dem ersten Feld einfach weg, liefert SUBSTR ein leeres Resultat.

Leider kann ich grade nicht nachvollziehen warum das passiert - und leider bin ich auch nicht grade ein Freak in SQL.
Grundsätzlich habe ich eine Tabelle "block" in der 2 user id's eingetragen sind nach dem Schema, wer blockiert wen. Nun möchte ich eine Liste von Nachrichten ausgeben, die NICHT die von denen auf der block-Liste enthalten.

die tabelle rename verhält sich ähnlich - hier sind alternative Benutzernamen abgelegt, die nur auf den jeweiligen USER {USER_ID} zutreffen.

hat irgendwer dieses nun verstanden? :) Und kann man es lösen?

  1. Moin!

    schränke ich hier jedoch nun mit GROUP BY messages.msgid die Ergebnismenge ein, werden im Feld "head" also dem substring mit den angehängten "..." nur noch soviele Zeichen angezeigt wie in den "" des CONCAT angegeben werden. Ganz gleich welche.

    Wenn du gruppierst, müssen alle deine hinter SELECT aufgezählten Spalte eine dieser beiden Bedingungen erfüllen:

    1. Der Spaltenname kommt im GROUP BY vor - dann darf er "nackt" verwendet werden.
    2. Der Spaltenname kommt nicht in GROUP BY vor - dann mußt du zwingend eine der Aggregatfunktionen (z.B. COUNT, MAX, MIN, SUM,...) auf die Spalte anwenden.

    Gruppieren nach der Message-ID erscheint mir überdies ziemlich sinnlos, weil IDs ja eindeutig sind, in einer Tabelle nur einmalig vorkommen, und dein JOIN jetzt erstmal nicht impliziert, dass im Abfrageergebnis eine solche ID mehrfach vorkommt.

    - Sven Rautenberg

    1. Hallo Sven!

      Vielen Dank! Das war sehr hilfreich! Ich hab das Query jetzt verworfen und durch ein völlig neues ersetzt!

      thanx, Markus

      Moin!

      schränke ich hier jedoch nun mit GROUP BY messages.msgid die Ergebnismenge ein, werden im Feld "head" also dem substring mit den angehängten "..." nur noch soviele Zeichen angezeigt wie in den "" des CONCAT angegeben werden. Ganz gleich welche.

      Wenn du gruppierst, müssen alle deine hinter SELECT aufgezählten Spalte eine dieser beiden Bedingungen erfüllen:

      1. Der Spaltenname kommt im GROUP BY vor - dann darf er "nackt" verwendet werden.
      2. Der Spaltenname kommt nicht in GROUP BY vor - dann mußt du zwingend eine der Aggregatfunktionen (z.B. COUNT, MAX, MIN, SUM,...) auf die Spalte anwenden.

      Gruppieren nach der Message-ID erscheint mir überdies ziemlich sinnlos, weil IDs ja eindeutig sind, in einer Tabelle nur einmalig vorkommen, und dein JOIN jetzt erstmal nicht impliziert, dass im Abfrageergebnis eine solche ID mehrfach vorkommt.

      • Sven Rautenberg