Sql Abfragenproblem



  • Also ich habe eine Tabelle ero_news bestehend aus id, sender, sichtbar_fuer, nachricht, titel und timestamp.

    In dieser sind Nachrichten für mein Browsergame gespeichert(du wurdest angegrifen, du hast einen Sion gefangen usw).
    In dieser Datenbank werden auch globale Nachrichten angezeigt, sprich Nachrichten die für jeden sichtbar sind und dann ein sichtbar_fuer -1 stehen haben.

    Wie bekomme ich es nun hin, das nur die globalen Nachrichten angezeigt werden, die NACH der ersten "normalen" Nachricht stehen.

    sprich ich habe stehen

    id sichtbar_fuer titel                              text
    0  1             Willkommen bei Eternal Reign       bla
    1  -1            test globale Nachricht             bla
    2  2             Willkommen bei Eternal Reign       bla
    3  1             Ein Zauber wurde auf dich gewirkt  bla
    4  -1            Eine Goblinplage fraß alles
    [..]
    

    Spieler 1 soll nun diese News lesen: 0,1,3,4
    Und Spieler 2 soll folgende lesen können: 2,4

    Die Frage ist jetzt geht das mit einer Abfrage das Spieler 2 news 1 nicht sieht usw oder muss ich erst die erste News des Spielers abfragen.



  • d.h. in sichtbar_fuer stehen die User-Nummern drin?

    dann ist es doch einfach:

    select * from ero_news where sichtbar_fuer = -1 or sichtbar_fuer = user_id
    


  • @Linnea:
    Du hast das nicht mit drin:
    Wie bekomme ich es nun hin, das nur die globalen Nachrichten angezeigt werden, die NACH der ersten "normalen" Nachricht stehen.

    Ob das Folgende wirklich klappt hängt davon ab, ob dein Datenbanksystem solche Sub-Selects oder die MIN-Funktion unterstützt (selbstverständlich ungetestet):

    SELECT * FROM ero_news WHERE (sichtbar='-1' OR sichtbar=SpielerNummer) AND id>=(SELECT MIN(id) FROM ero_news WHERE sichtbar=SpielerNummer);

    In SpielerNummer muss natürlich noch 1 oder 2 rein und die ' fehlen auch noch, aber ich weiss ja nicht, wie du das Statement erstellst (dynamisch/statisch/per C++/aus einem Programm/auf der Datenbank/...).



  • hm also ich nehm php mit mysql und klopp die Abfragen auch mit php direkt rein.

    SELECT * FROM ero_msgs 
    WHERE (sichtbar_fuer = '-1' OR sichtbar_fuer = 1 ) 
    AND id>=(SELECT MIN(id) 
    FROM ero_msgs 
    WHERE sichtbar_fuer =1);
    

    scheint da aber nicht zu gehen, der meint
    #1064 - You have an error in your SQL syntax near 'SELECT MIN( id )
    FROM ero_msgs
    WHERE sichtbar_fuer =1 ) ' at line 4

    😕

    Geht einfach nur darum das ich da so wenig Abfragen wie möglich drin haben will weil ich da halt so 50 Neuanmeldungen
    die Woche hab und öm... viele Leute viele Abfragen und 2 abfragen = 2*viele abfragen :>



  • Ist evtl. die MySQL-Version zu alt ? Subqueries kann MySQL in älteren Versionen gar nicht...



  • SELECT * FROM ero_msgs 
    WHERE (sichtbar_fuer = '1')
    OR ((sichtbar_fuer = -1 ) 
    AND (id > 
       (SELECT MIN(id) FROM ero_msgs 
       WHERE (sichtbar_fuer =1))));
    

    und so? Unterstützt MySQL mittlerweile Subqueries?



  • #1064 - You have an error in your SQL syntax near 'SELECT MIN( id )
    FROM ero_msgs
    WHERE ( sichtbar_fuer =1 ) ) ) )' at line 4

    hab auch den Eindruck der will die Subqueries nich.. sind mehr ehrlichgesagt auch neu 😉
    mysql ver ist 3.23.58



  • dreaddy schrieb:

    sichtbar_fuer = '-1' OR sichtbar_fuer = 1

    Da ist auch noch ein Fehler. Entweder Text oder Zahl -> mit oder ohne '



  • das is glaubich egal, da habich vollstes Vertrauen das mysql das erkennt
    Naja vollstes auch nicht :p *probier*

    hm jo
    select * from ero_msgs where sichtbar_fuer = 1 or sichtbar_fuer = '-1'
    geht zum Beispiel



  • Das ist mir nun wieder neu. 😃



  • Strings werden in Hochkommas gesetzt. Zahlen nicht. Bei Zahlen ist es aber egal ob in Hochkommas oder nicht. Bei strings ist es erforderlich sonst Fehler.

    Der Subquery ist IMHO unötig. Ich sehe nicht was der bringt. Subquerys gibt es erst ab MySQL 4.1.x.
    Ein timestamp in der Tabelle könnte noch helfen. Dann muss man nicht immer alle Datensätze abfragen. Man merkt sich die letzte ID oder letzte Zeit und mach
    WHERE id > gemerkt
    WHERE timestamp > letztezeit



  • dreaddy schrieb:

    mysql ver ist 3.23.58

    Habs gerade nachgelesen: Ab 4.1 kann MySQL Subqueries.

    (Die 4.1er Version kommt mir übrigens irgendwie schneller vor, als die 3er...)


Anmelden zum Antworten