Ergebnis 1 bis 8 von 8
  1. #1
    Shark's Homie Avatar von sh1ny
    Registriert seit
    Sep 2010
    Ort
    Zürich
    Beiträge
    131

    Unhappy Verzweifel an schwerem SQL Query [PHP]

    Hey Leute.

    Ich bin's mal wieder mit einem Problem .

    Dieses Query:
    PHP-Code:
    SELECT re.idre.rezept_nameroundavgk.bewertung ) , ) AS bewertung,
    re.endproduktre.rezept_zubereitungu.user_nickname 
    FROM tbl_rezepte 
    AS re 
    INNER JOIN tbl_user 
    AS u ON re.user_fk u.id 
    LEFT JOIN tbl_kommentare 
    AS k ON k.rezept_fk re.id
    ORDER BY re
    .id DESC 
    Bereitet mir seit ein paar Tagen grosse Schwierigkeiten. Es will einfach nicht Funktionieren.
    Code:
    Es sollte mir alle Daten aus tbl_rezepte anzeigen.
    Wenn die bewertung von tbl_kommentare zum einzelnen Rezept vorhanden ist,
    soll sie mit dem gerundeten durchschnitt der Bewertung 
    des einzelnen Rezeptes angezeigt werden.
    Ziel:
    Code:
    Pepperoni Gemüse Rezept
    Bewertung: 4.5
    von 111
    Endprodukt: Pepperoni Gemüse
    
    Schneide 3 Pepperonis in kleine Streifen.
    SQL Query der Tabellen um die es geht:
    PHP-Code:
    -- --------------------------------------------------------

    --
    -- 
    Tabellenstruktur für Tabelle `tbl_kommentare`
    --

    CREATE TABLE IF NOT EXISTS `tbl_kommentare` (
      `
    idbigint(20unsigned NOT NULL AUTO_INCREMENT,
      `
    bewertungint(255) DEFAULT NULL,
      `
    kommentartext NOT NULL,
      `
    datum_erstelltdatetime NOT NULL,
      `
    user_fkbigint(20unsigned NOT NULL,
      `
    rezept_fkbigint(20unsigned NOT NULL,
      
    PRIMARY KEY (`id`),
      
    KEY `user_fk` (`user_fk`),
      
    KEY `rezept_fk` (`rezept_fk`)
    ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;

    -- --------------------------------------------------------

    --
    -- 
    Tabellenstruktur für Tabelle `tbl_rezepte`
    --

    CREATE TABLE IF NOT EXISTS `tbl_rezepte` (
      `
    idbigint(20unsigned NOT NULL AUTO_INCREMENT,
      `
    user_fkbigint(20unsigned NOT NULL,
      `
    datum_erstelltdatetime DEFAULT NULL,
      `
    rezept_namevarchar(255NOT NULL,
      `
    rezept_zubereitungtext NOT NULL,
      `
    endproduktvarchar(50NOT NULL,
      
    PRIMARY KEY (`id`),
      
    UNIQUE KEY `id` (`id`),
      
    KEY `user_fk` (`user_fk`)
    ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;

    -- --------------------------------------------------------

    --
    -- 
    Tabellenstruktur für Tabelle `tbl_user`
    --

    CREATE TABLE IF NOT EXISTS `tbl_user` (
      `
    idbigint(20unsigned NOT NULL AUTO_INCREMENT,
      `
    user_namevarchar(255) DEFAULT NULL,
      `
    user_vornamevarchar(255) DEFAULT NULL,
      `
    user_nicknamevarchar(255NOT NULL,
      `
    user_passwordvarchar(255NOT NULL,
      `
    isAdmintinyint(1NOT NULL,
      `
    user_emailvarchar(255NOT NULL,
      
    PRIMARY KEY (`id`),
      
    UNIQUE KEY `id` (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=42 
    Ich hoffe ihr könnt mir helfen, Vielen Dank
    euer sh1ny
    Geändert von sh1ny (23. 01. 2012 um 11:30 Uhr)

  2. #2
    Nerd

    Board:Crew

    Avatar von Kugelfisch23
    Registriert seit
    Oct 2007
    Ort
    Im Ozean
    Beiträge
    16.810

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Nutzt du MySQL als DBMS? Wenn ja: Die Fehlermeldung
    ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
    bei der Ausführung deines Querys weist explizit auf die Problemursache hin: Es fehlt ein GROUP-BY-Statement. Ausserdem wäre eventuell eine Veknüpfung mit den Benutzerdaten in Form eines LEFT-(OUTER-)JOINs sinnvoller, da u.U. auch Rezepte ohne zugeordneten Autor denkbar wären, z.B. wenn dieser sein Benutzerkonto gelöscht hat.

  3. #3
    Shark's Homie

    (Threadstarter)

    Avatar von sh1ny
    Registriert seit
    Sep 2010
    Ort
    Zürich
    Beiträge
    131

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Nach der "GROUP-BY" -Lösung, sollte es so eig. gehen:
    Code:
    SELECT re.id, re.rezept_name, round( avg( k.bewertung ) , 1 ) AS bewertung, re.endprodukt, re.rezept_zubereitung, u.user_nickname
    FROM tbl_rezepte AS re
    INNER JOIN tbl_user AS u ON re.user_fk = u.id
    LEFT JOIN tbl_kommentare AS k ON k.rezept_fk = re.id
    GROUP BY re.id
    ORDER BY re.id DESC
    LIMIT 0 , 30
    geht aber leider nicht, denn es gibt mir bei der "k.bewertung" einfach NULL zurück.

  4. #4
    Mitglied
    Registriert seit
    Mar 2007
    Beiträge
    2.700

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Wenn da NULL raus kommt, dann bedeutet dass, das der LEFT JOIN keine Datensätze gefunden hat, es also noch keine Kommentare zu dem gewünschten Datensatz gibt. Die Anzahl der Kommentare bekommst du dann übrigens mit COUNT(k.bewertung). Solltest du immer einen numerischen Wert anstelle von NULL haben wollen, so umschließe den Ausdruck der NULL ergeben kann mit der Funktion COALESCE(). COALESCE() gibt dabei den ersten von NULL verschiedenen Parameter zurück, COALESCE(NULL, 1) ergibt also z.B. 1.

  5. #5
    Shark's Homie

    (Threadstarter)

    Avatar von sh1ny
    Registriert seit
    Sep 2010
    Ort
    Zürich
    Beiträge
    131

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Also Leute:

    Ich habe es nun mit 2 Querys hingebracht.

    Es hat sich dann aber ein 2tes problem eingeschlichen, und zwar das Paging.
    Ich müsste eine Zahl haben, die mir genau die Anzahl datensätze anzeigt, die aus dem bestimmten Query entstehen.
    Nur leider müsste diese Zahl vor der While schleife (zum ausgeben) entstehen.
    gibt es irgendeine Funktion inder ich die Anzahl Datensätze dieses Query's:
    Code:
    SELECT re.id, re.rezept_name, round(avg(k.bewertung),1) AS bewertung,
    re.endprodukt, re.rezept_zubereitung, u.user_nickname 
    FROM tbl_rezepte AS re 
    INNER JOIN tbl_user AS u ON re.user_fk = u.id 
    LEFT JOIN tbl_kommentare AS k ON k.rezept_fk = re.id
    WHERE k.bewertung != 0 AND k.rezept_fk is not NULL
    GROUP BY re.id
    ORDER BY bewertung DESC
    ausgeben kann?

    Wäre sehr schön wenn ihr mir helfen könntet.
    sh1ny

  6. #6
    Nerd

    Board:Crew

    Avatar von Kugelfisch23
    Registriert seit
    Oct 2007
    Ort
    Im Ozean
    Beiträge
    16.810

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Die Anzahl der Ergebnis-Zeilen eines beliebigen SQL-Querys liefert dir mysql_num_rows().

    Bedenke jedoch, dass es weit effizienter wäre, bereits im Query durch eine passende LIMIT-Direktive die Anzahl der zu selektierenden Datensätze zu beschränken, statt alle Datensätze zu selektieren, auszulesen und dann nur einige wenige auszugeben. Um die Anzahl der Datensätze in der Tabelle tbl_rezepte zu bestimmen - diese bestimmt die Anzahl der Seiten, sofern sichergestellt ist, dass zu jedem Rezept genau ein Benutzer existiert oder du anstelle des INNER JOIN ein LEFT JOIN nutzen würdest - könntest du ein sehr viel einfacheres Query wie
    SELECT COUNT(*) FROM tbl_rezepte
    auslesen.

  7. #7
    Shark's Homie

    (Threadstarter)

    Avatar von sh1ny
    Registriert seit
    Sep 2010
    Ort
    Zürich
    Beiträge
    131

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Hmm.. ok danke.

    Ich habe nun die MySQL "Funktion" "Union" gefunden. mit dieser Funktion wäre mein vorhaben erheblich einfacher, allerdings weiss ich nicht ob sie bei 2 so grossen Querys funktionieren:

    Kann ich das so verwenden?
    Code:
    (
    SELECT re.id, re.rezept_name, round(avg(k.bewertung),1) AS bewertung,
    re.endprodukt, re.rezept_zubereitung, u.user_nickname, bild 
    FROM tbl_rezepte AS re 
    INNER JOIN tbl_user AS u ON re.user_fk = u.id 
    LEFT JOIN tbl_kommentare AS k ON k.rezept_fk = re.id
    WHERE k.bewertung != 0 AND k.rezept_fk is not NULL
    GROUP BY re.id
    ORDER BY bewertung DESC
    )
    UNION
    (
    SELECT re.id, re.rezept_name, round(avg(k.bewertung),1) AS bewertung,
    re.endprodukt, re.rezept_zubereitung, u.user_nickname 
    FROM tbl_rezepte AS re 
    INNER JOIN tbl_user AS u ON re.user_fk = u.id 
    LEFT JOIN tbl_kommentare AS k ON k.rezept_fk = re.id
    GROUP BY re.id
    ORDER BY re.id DESC
    LIMIT 0, 10
    )
    Vielen Dank
    sh1ny

  8. #8
    Nerd

    Board:Crew

    Avatar von Kugelfisch23
    Registriert seit
    Oct 2007
    Ort
    Im Ozean
    Beiträge
    16.810

    Standard Re: Verzweifel an schwerem SQL Query [PHP]

    Bedenke, dass die über UNION vereinigten Zeilen dieselbe Anzahl an Spalten haben und die Spalten von identischen Typen sein müssen (vgl. http://dev.mysql.com/doc/refman/5.1/de/union.html). Das ist in deinem Fall nicht gegeben. Ausserdem stellt sich mir die Frage, was genau du erreichen möchtest - dein Query scheint mir unnötig komplex.

  9.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •