Ankündigung

Einklappen
Keine Ankündigung bisher.

Subqueris mit Regexp Anweisungen und Counter

Einklappen

Neue Werbung 2019

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

  • Subqueris mit Regexp Anweisungen und Counter

    Erstmal einen wunderschönen guten Tag an Alle

    Ich habe folgendes Problem, und zwar habe ich eine SQL-Abfrage erstellt, welche mir aus der Haupttabelle einige Daten auslesen soll, und gleichzeitig aus der Subtabelle die Einträge zählen soll.

    Anwendung
    - Kategorien mit Einträgen (ähnlich einem News System), jedoch mit Mehrfachauswahl der Kategorie.

    Tabellenstruktur (Haupttabelle)
    category_id
    category_title

    Tabellenstruktur (Subtabelle)
    item_id
    item_title
    item_categoryids (KategorieID1.KategorieID2.Kategorie3.usw)


    SQL Befehl
    Code:
    SELECT 
            c.category_id, c.category_title, 
            (SELECT COUNT(cs.item_id) FROM linkus_items AS cs WHERE cs.item_categoryids REGEXP('^\\\.{c.category_id}$|\\\.{c.category_id}\\\.|\\\.{c.category_id}$')) AS category_counter
        FROM linkus_categories AS c
        ORDER BY c.category_title ASC
        LIMIT 0,10
    Mein Problem ist allerdings, dass egal wie, die Subeinträge (items) nicht gezählt werden. Der Counter zeigt mir immer eine 0 an, egal wieviele Einträge enthalten sind.
    Ich vermute mein Problem ist ein Denkfehler, aber komme seit 2 Tagen nicht dahinter ..

    Ich bedanke mich schon im vorraus, liebe Grüße, David.

  • #2
    Das sieht eher nach nem falschen DB Design aus (nicht normalisierte Datenbank). Normalerweise linkt man die IDs per Foreign Key, dann geht das ganz einfach mit JOIN und GROUP BY.

    Kommentar


    • #3
      Hallo Dormilich,

      kannst du mir eventuell genauer beschreiben, was du meinst?

      Im Grunde funktioniert die Abfrage (jedoch nicht mit dem Regexp) ..

      Folgendes funktioniert ohne Probleme
      Code:
       SELECT
       c.category_id, c.category_title,          
        (SELECT COUNT(cs.item_id) FROM linkus_items AS cs WHERE cs.item_categoryids=c.category_id) AS category_counter    
      FROM linkus_categories AS c    
      ORDER BY c.category_title ASC    
      LIMIT 0,10
      Sobald ich jedoch das ganze umbaue auf Regexp funktioniert es nicht, welches ich aber brauche, da ja der Eintrag in mehreren Kategorien sein kann (und hier werden die einzelnen IDs durch einen Punkt getrennt).

      Kommentar


      • #4
        Zitat von David1301 Beitrag anzeigen
        da ja der Eintrag in mehreren Kategorien sein kann (und hier werden die einzelnen IDs durch einen Punkt getrennt).
        Das macht nur Probleme. Normalisier die Tabelle (eine category_id-Referenz pro Eintrag als FK), dann bist du das Problem auch los.

        Kommentar


        • #5
          http://www.peterkropff.de/site/mysql/normalisierung.htm bzw. http://www.sqldocu.com/nine/normalform1.htm

          und

          http://www.sqldocu.com/nine/relationship.htm (1:n bzw. n:m Beziehung für deinen Fall)
          The string "()()" is not palindrom but the String "())(" is.

          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


          • #6
            Solche Datenanalysen und -Verarbeitung basiert auf verketteten Strings ist nicht im Sinne einer relationalen DB. Erst Recht nicht, wenn die DB wenig geeignete Hilfsmittel mitbringt, den Kram aufzudröseln.
            Aber sei's drum, wenn Du den Sch.. weiter treiben willst, würde ich mir eine Operation (SP) bauen, die die Kategorien in Zeilen aufbricht, das kann man dann schön zählen.
            Als Denkansatz mal dieser Link zu SO:
            http://stackoverflow.com/questions/1...-multiple-rows
            (nur für das Aufbrechen, zählen kommt extra, kriegst Du dann sicher auch so hin)

            Kommentar


            • #7
              Sorry für die späte Antwort ..

              habe nun die Datenbank Tabelle umgebaut - alles funktioniert bestens!

              Vielen Dank an euch

              Kommentar

              Lädt...
              X