2016-04-12 2 views
2

Ich habe zwei Tabellen wie folgt aus:Wie kann ich "true" zurückgeben, wenn die Bedingung der where-Klausel falsch ist?

// Posts 
+----+---------+-----------------+----------+ 
| id | title | content  | amount | 
+----+---------+-----------------+----------+ 
| 1 | title1 | content1  | NULL  | 
| 2 | title2 | content2  | 1000  | 
| 3 | title3 | content3  | 5000  | 
| 4 | title4 | content4  | NULL  | 
| 5 | title5 | content5  | 2000  | 
+----+---------+-----------------+----------+ 
//        ^NULL means that question is free 


// Money_Paid 
+----+---------+---------+ 
| id | user_id | post_id | 
+----+---------+---------+ 
| 1 | 123  | 2  | 
| 2 | 345  | 5  | 
| 3 | 123  | 5  | 
+----+---------+---------+ 

Alles, was ich versuche zu tun: Einige meiner Beiträge nicht frei sind und jeder will, dass sie ihre Kosten bezahlen sehen sollten. Jetzt brauche ich eine Abfrage, um zu überprüfen, ob der aktuelle Benutzer die Kosten für diesen Beitrag bezahlt hat oder nicht? (nur für unfreie Post)

select *, 
    (select count(1) from Money_paid mp where p.amount is not null and mp.post_id = p.id and mp.user_id = :user_id) paid 
from Posts p 
where p.id = :post_id 

Hier ist ein paar Beispiele: (basierend auf aktuellen Tabellen)

$stm->bindValue(":post_id", 2, PDO::PARAM_INT); 
$stm->bindValue(":user_id", 123, PDO::PARAM_INT); 
// paid column => 1 (the user of '123' can see this post because he paid post's cost) 

$stm->bindValue(":post_id", 2, PDO::PARAM_INT); 
$stm->bindValue(":user_id", 345, PDO::PARAM_INT); 
// paid column => 0 (the user of '345' cannot see this post because he didn't pay post's cost) 

$stm->bindValue(":post_id", 5, PDO::PARAM_INT); 
$stm->bindValue(":user_id", 345, PDO::PARAM_INT); 
// paid column => 1 

Was ist mein Problem ? Die Ausgabe meiner Abfrage ist 0, wenn der Beitrag frei ist. (Ich brauche 1, wenn Beitrag frei ist).

Wieder. Ich brauche 1 für beide kostenlose Beiträge und bezahlte Benutzer, und 0 für unbezahlte Benutzer. Zum einfachen Umgang mit PHP wie dieser

if ($result['paid'] == 1) { 
    // show it 
} elas { 
    // doesn't show it 
} 

Wie kann ich es beheben?

+0

Einfach nur neugierig, warum Sie benötigen drei Ausgänge - warum nicht nur abgefragt werden, ob der Benutzer den Beitrag sehen können oder nicht, ob frei oder sie bezahlt? – AbraCadaver

+0

@AbraCadaver Sie haben Recht. Aber meine Abfrage gibt '0' sowohl für unbezahlte Benutzer als auch für freie Posts zurück. Ich brauche es "1" für freie Beiträge zurück. Wie kann ich das machen? Um es einfach in PHP zu behandeln: 'if ($ result ['paid'] == 1) {// zeige es} else {// zeige es nicht}' – stack

+0

Ich habe meine Frage bearbeitet. – stack

Antwort

2

habe ich nicht getestet, aber ich denke, das $result['paid'] >= 1 geben wird, wenn der Benutzer bezahlt hat oder der Post frei oder $result['paid'] == 0 wenn es nicht frei, und der Benutzer ist nicht bezahlt:

SELECT COUNT(*) AS paid FROM Post p, Money_paid mp 
     WHERE p.amount IS NULL OR (mp.post_id = p.id AND mp.user_id = :user_id) 

In kurz, if($result['paid'] == 0) nicht anzeigen oder wenn Sie möchten if($result['paid'] >= 1) zeigen.

Basierend auf Ihrem Kommentar die Post-Daten zu erhalten:

SELECT p.title, p.content FROM Post p, Money_paid mp 
     WHERE p.amount IS NULL OR (mp.post_id = p.id AND mp.user_id = :user_id) 

dann die num_rows() oder äquivalente Funktion von Ihrem DB-API verwenden, um zu entscheiden, ob es zu zeigen.

+0

Diese Abfrage sollte keine Unterauswahl oder Groß-/Kleinschreibung erfordern. – AbraCadaver

+0

Die Idee Ihrer Anfrage ist großartig .. Aber Ihre Anfrage ist * unvollständig *.Ihre Abfrage prüft nur, ob ich dem aktuellen Benutzer einen solchen Beitrag zeigen soll oder nicht, während meine Abfrage * (in der Frage) * sowohl prüft als auch den Post abruft. – stack

0

Ich bin nicht sicher, ob diese Abfrage das Beste ist, aber es funktioniert:

select *, 
    case when p.amount is null then '1' 
      else (select count(1) 
        from Money_paid mp 
       where mp.post_id = p.id and mp.user_id = :user_id limit 1) 
    end paid 
from Posts p 
where p.id = :post_id 

So $result['paid']1 für beide Benutzer sein wird, die die Kosten und die freie Beiträge bezahlt. Und es wird 0 für unbezahlte Benutzer sein.

0

Versuchen Sie folgendes:

select count(*) from (select * from Posts p innerjoin Money_Paid mp on p.id=mp.post_id) where id=:post_id and (amount is null or user_id=:user_id) 
Verwandte Themen