Ankündigung

Einklappen
Keine Ankündigung bisher.

MySql: die Treffer von like als hits und in WHERE-Klausel benutzen...

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySql: die Treffer von like als hits und in WHERE-Klausel benutzen...

    Hallo Forum,

    nun im großen und ganzen habe ich mein Query fertig, letztlich wollte ich für Text-suche noch Zeilen ohne Treffer ausschließen.

    Ich zähle die Treffer wie folgt:
    Code:
    ((tit LIKE '%runde%') + (tit LIKE '%mit%') ) AS hits
    und wollte jetzt am Ende ein hits > 0 in der WHERE hinzufügen, jedoch bekomme ich die Meldung die Spalte hits ist nicht vorhanden...

    Komplett schaut es so aus:
    Code:
    SELECT a.id, typ, tit, stit, start, ends, ((tit LIKE '%worteins%') + (tit LIKE '%wortzwei%') ) AS hits, pic.ext, pic.srv, pic.ar FROM <pf>auc_article AS a
        LEFT JOIN <pf>media_pic AS pic ON pic.oid = CONCAT('auc-', a.id) AND pic.id = 1
    WHERE cat = :cat AND top = :top AND hits > 0 ORDER BY hits DESC, ends ASC LIMIT 50
    Hätte Jemand eine Lösung wie ich mein Ziel dennoch erreiche? Also eben Einträge ohne Treffe nicht zu selektieren?


    MfG: Paykoman


  • #2
    Probier mal dein ganzen Ausdruck
    ((tit LIKE '%runde%') + (tit LIKE '%mit%') ) anstelle von hits im WHERE.
    PHP-Klassen auf github

    Kommentar


    • #3
      MOD: Verschoben von PHP-Einsteiger
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von Paykoman Beitrag anzeigen
        jedoch bekomme ich die Meldung die Spalte hits ist nicht vorhanden...
        Was völlig korrekt ist, sie ist nun mal nicht vorhanden, sondern wird erst berechnet. Was Du machen kannst:
        • den kompletten Ausdruck noch einmal verwenden
        • mit WITH arbeiten. Wenn MySQL das könnte
        • mit Subselects arbeiten
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Hallöchen,

          danke für die Tipps, es gab aber eine einfachere Lösung
          Ein "HAVING hits > 0" vor der ORDER BY-Klausel löst das oben genannte Problem...
          Habe es eben auch bissl durchgetestet was pagination angeht, hier lade ich dann immer 50 Artikel und mittels JS wird beim Client gezählt wie viele Artikel angezeigt wurden so das ich die DB-Abfrage in php ergänzen kann, z.B. LIMIT 133,50, besseres viel mir bis dato nicht ein.

          Habe hier und da schon gelesen das LIMIT die selects verlangsamt aber ich denke es ist immer noch besser als wenn der Server 10mio Datensätze auf einmal selectieren müsste und der client entsprechend diese verarbeiten muss...
          So habe ich unten ein "Zeige mir mehr..." Button der dann die Abfrage auslöst =)

          LG: Paykoman

          Kommentar


          • #6
            Das sieht doch irgendwie nach Murks aus.

            Wenn du
            etztlich wollte ich für Text-suche noch Zeilen ohne Treffer ausschließen.
            diese Bedingung haben willst, dann packe es doch ins WHERE, das wollte dir jspit schon im Beitrag #2 mitteilen.

            Demnach so
            Code:
            SELECT
                a.id, typ, tit, stit, start, ends, pic.ext, pic.srv, pic.ar
            FROM
                <pf>auc_article AS a
            LEFT JOIN
                <pf>media_pic   AS pic
                ON
                    pic.oid = CONCAT('auc-', a.id)
                    AND pic.id = 1
            WHERE
                cat = :cat
                AND top = :top
                AND tit LIKE '%worteins%'
                AND tit LIKE '%wortzwei%'
            ORDER BY
                ends ASC
            LIMIT 50
            Wenn du zusätzlich die Anzahl brauchst, dann verwende zusätzlich COUNT'(tit) im SELECT
            und füge ein GROUP BY tit mit ein.

            Kommentar

            Lädt...
            X