Wie kann ich diese Bedingungen in mein Query einbauen?

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

  • Wie kann ich diese Bedingungen in mein Query einbauen?

    Ich habe dieses Query hier das ich via einem ORM generiert habe das so weit auch gut funktioniert. Die OR Bedingung gleicht sich weil einmal mit 'User' als model und einmal mit 'Group' abgefragt wird. Das denied Feld ist 1 oder 0 um einen User oder Gruppe auszuschließen.

    Code:
    SELECT 
            SocialObjects.id AS `SocialObjects__id`, SocialObjects.user_id AS `SocialObjects__user_id`, SocialObjects.foreign_key AS `SocialObjects__foreign_key`, SocialObjects.model AS `SocialObjects__model`, SocialAccess.id AS `SocialAccess__id`, SocialAccess.accessor_id AS `SocialAccess__accessor_id`, SocialAccess.accessor_model AS `SocialAccess__accessor_model`, SocialAccess.object_id AS `SocialAccess__object_id`, SocialAccess.object_model AS `SocialAccess__object_model`, SocialAccess.denied AS `SocialAccess__denied` 
    FROM    social_objects SocialObjects
    INNER JOIN social_access SocialAccess ON SocialObjects.id = (SocialAccess.object_id)
    WHERE
    (
        (
             (SocialAccess.accessor_model = :c0 AND SocialAccess.accessor_id = :c1)
        OR 
             (SocialAccess.accessor_model = :c2 AND SocialAccess.accessor_id in (:c3))
        )
        AND SocialAccess.denied = :c4
    )
    Mein Problem, welches ich erst hinterher realisiert habe, ist das mir zwei Bedingungen fehlen und ich nicht sicher bin wie ich die in das Query bekomme:
    • Wenn mein Benutzer denied = 1 ist soll das social_object nicht ausgewählt werden, egal in welchen Gruppen der User ist.
    • Ist der user nur in einer Gruppe für dieses social_object und ist diese Gruppe denied = 1 dann soll das social_object auch nicht selektiert werden.
    • Es dürfen keine Duplikate der social_objects gezogen werden.


    Wie kann ich das möglichst performant bewerkstelligen? Ich benutze MySQL 5.6 würde es aber vorziehen ohne allzu exotische SQL funktionen auszukommen. Performance ist ebenfalls ein Faktor, das Ganze muß auch noch mit ~100.000 Usern gut laufen Millionen sind mir egal, das nächste Facebook ist das Projekt definitiv nicht , es ist aktuell ein reines Spaßprojekt so weit, es wäre aber natürlich wünschenswert wenn es gut läuft.

    Beispieldaten gibt es hier.

    Es gibt ja auch IF ELSE in SQL aber ich bin noch nicht drauf gekommen wie ich das hier einbauen kann. Subqueries wären eventuell auch eine Möglichkeit aber ich bezweifel das dies dann noch performant ist?

    Edit: Gerade probiert das hier mit ins WHERE zu stecken aber ohne Erfolg.

    Code:
    AND sp.accessor_id IN (1))) AND CASE WHEN (sp.accessor_model = 'User' AND sp.denied = 1 AND sp.accessor_id =1) THEN FALSE ELSE TRUE
    Zuletzt geändert von burzum; 13.02.2015, 12:45.
Lädt...
X