SQl Frage mehrende Counts

  • Gute Abend Leute, ich stehe gerade auf dem Schlauch und weiß nicht wie ich aus diesen 2 SQL abfragen beide COUNT addieren kann.

    Gibt es ein Möglichkeit aus beiden query eine zu machen?
    Oder muss ich mit beiden leben und per php addieren.


    SQL
    1. SELECT anime.animeID, COUNT(tags.tagID) AS COUNT
    2. FROM anima1_anime anime
    3. LEFT JOIN wcf1_tag_to_object tags
    4. ON (anime.animeID = tags.objectID)
    5. WHERE tags.tagID IN (62,312,551,1834,3249,3754,4789,5750,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402) AND tags.objectTypeID = 2535 AND anime.animeID != 612 AND anime.isDeleted = 0 AND anime.isDisabled = 0
    6. GROUP BY anime.animeID
    7. ORDER BY COUNT DESC LIMIT 3
    animeID COUNT
    614 3
    469 3
    1963 2


    SQL
    1. SELECT anime.animeID, COUNT(genre.categoryID) AS COUNT
    2. FROM anima1_anime anime
    3. LEFT JOIN anima1_anime_to_genre genre
    4. ON (anime.animeID = genre.animeID)
    5. WHERE genre.categoryID IN (18,20,30,33) AND anime.animeID != 612 AND anime.isDeleted = 0 AND anime.isDisabled = 0
    6. GROUP BY anime.animeID
    7. ORDER BY COUNT DESC LIMIT 3


    animeID COUNT
    1884 4
    1880 4
    614 4



    Jetzt sollte draus dies werden.

    animeID COUNT
    614 7
    1884 4
    1880 4
    469 3
    1963 2
  • Du solltest nicht so verwirrende Namen benutzen. Was du hast sind COUNT(), nicht SUM() Werte, die dann SUM zu benennen ist wenig zielführend. Ich hab gerade eine ganze Weile dummdämlich da rauf rumgestarrt um rauszufinden, wo du denn nun zur Hölle summierst ;)


    Im Zweifel geht immer der Holzhammer:


    SQL
    1. SELECT
    2.     tagCount,
    3.     categoryCount
    4. FROM
    5. (<query1>) as tagCount,
    6. (<query2>) as categoryCount


    Aber ob sich das wirklich lohnt solltest du profilen, letzteres macht auch einen impliziten JOIN

    "A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP" — Leonard Nimoy

  • Danke erstmal.


    habe den ersten beitrag mal überarbeitet.

    Dein Code Hilfe hat mir noch nicht geholfen evtl auch zu spät abends.


    Mein Lösungs ansatzt ist jetzt folgender

  • SQL
    1. SELECT anime.animeID, COUNT(tags.tagID) AS TAG_COUNT, COUNT(genre.categoryID) AS GENRE_COUNT, TAG_COUNT + GENRE_COUNT AS COUNT_TOTAL
    2. FROM anima1_anime anime
    3. LEFT JOIN wcf1_tag_to_object tags ON (anime.animeID = tags.objectID)
    4. LEFT JOIN anima1_anime_to_genre genre ON (anime.animeID = genre.animeID)
    5. WHERE genre.categoryID IN (18,20,30,33) AND anime.animeID != 612 AND anime.isDeleted = 0 AND anime.isDisabled = 0 AND tags.tagID IN (62,312,551,1834,3249,3754,4789,5750,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402) AND tags.objectTypeID = 2535
    6. GROUP BY anime.animeID
    7. ORDER BY COUNT_TOTAL DESC LIMIT 3

    Ungetestet, extrem hässlich und vermutlich nen performance Albtraum, aber wenn der Hammer nur groß genug ist kann man fast alles in einen Query quetschen :P

  • Habe jetzt eine zufriedenstellende Lösung gefunden.

    Werde isDeleted anderes prüfen da beim laden der IDs über einer xxxlist.class.php dies sowieso geprüft wird.