Where mit OR und AND

Basti_2015

Mitglied
Hallo, ich gebe Aktivitätslogs aus und sortiere diese einmal für den Nutzer und für den Admin. Der Nutzer sieht nur seine, der Admin/Verwaltung sieht alle Einträge.

PHP:
if($userID['u_status']>=100) {
                $query = "SELECT * FROM `activities` WHERE (`a_area`=1 AND `a_sender`=:user) OR `a_area`=2 OR `a_area`=3 ORDER BY `a_time` DESC";
                $statement = $this->prepare($query);
                $statement->bindParam(':user', $userID['u_id'], PDO::PARAM_INT);
            } else {
                $query = "SELECT * FROM `activities` WHERE (`a_area`=1 AND `a_sender`=:user) OR `a_area`=3 ORDER BY `a_time` DESC";
                $statement = $this->prepare($query);
                $statement->bindParam(':user', $userID['u_id'], PDO::PARAM_INT);
            }

legende: Area 1 sind eigene activities, Area2 sind Admin/Verwaltungsrelevant, Area 3 sind für alle, zB Rundmails.

Jetzt möchte ich jedoch nur noch die letzten zwei Wochen anzeigen lassen. Durch die OR Klausel wird jedoch das zweite AND übergangen.

SQL:
SELECT * FROM `activities` WHERE (`a_area`=1 AND `a_sender`=1 AND `a_time`>=1484997631) OR `a_area`=2 OR `a_area`=3 ORDER BY `a_time` DESC

Ich kann natürlich über eine IF Else Anweisung die Anfrage vor der Ausgabe filtern, möchte aber nicht jedesmal den ganzen Datenbankcontent laden, daher würde ich nur die benötigten Daten auslesen.
 
SQL:
where
  ( 
    `a_area`=1 
    OR `a_area`=2 
    OR `a_area`=3
  )
  AND `a_sender`=1 
  AND `a_time`>=1484997631

Oder schöner mittels IN()
SQL:
where
  `a_area` IN (1, 2, 3) 
  AND `a_sender`=1 
  AND `a_time`>=1484997631
 
ich habe mir angewöhnt (wegen der Übersichtlichkeit) eine Bedingung zu geben welche für ein "AND" erfüllt wird oder für ein "OR" nicht erfüllt wird...

Beispiel:

SQL:
WHERE 1=1 -- bedingung wird erfüllt
AND 'FELD1' IN (1, 2, 3)
AND 'FELD2' = 'WERT'
AND 'FELD3' LIKE '%ASDF%'
AND 'FELD4' IS NULL
AND 'FELD5' IS NOT NULL
AND 'FELD6' BETWEEN 1 AND 3

AND ( 1=2 -- bedingung wird nicht erfüllt
   OR 'FELD7' = 'test'
   OR 'FELD8' = 'was anderes'
)
und so weiter und so fort...
Jetzt fällt es mir Leicht Bedingungen "auszukommentieren" oder zu verstehen welche Bedingung ist Zwingend (ein UND davor), oder welche hängt an einer "anderen" Bedingung <- ein OR davor ( eingeklammert )...

> das bringt aber Funktional nichts, es ist nur für mich "schöner" geworden...

und ich hab mal rot Markiert, was für deinen Zeitraum vermutlich "besser" wäre
> AND 'FELD6' BETWEEN 1 AND 3
 
Zuletzt bearbeitet:
edit... leider habe ich nicht gefunden, wie man hier im Forum SQL richtig ausgibt :/
[code=sql]...[/code]

Oder über das Formatierungsmenü [Einfügen...] Wählen, dann Code. Anschliessend öffnet ein Pupup und man kann die Sprache auswählen

2017-02-06_125927.jpg
 
Zurück