MySQL-Select-Anweisung mit CASE oder IF ELSEIF? Ich bin mir nicht sicher, wie ich das Ergebnis erhalten soll


78

Ich habe zwei Tische. Man hat Herstellerinformationen und schließt die Regionen ein, in denen sie verkaufen können. Die anderen haben ihre Produkte zum Verkauf. Wir müssen die Sichtbarkeit des Produkts basierend auf den Regionen einschränken. Dies ist so, als hätte Netflix Videos in seinem System, die nur überall (1), nur in Kanada (2) und nur in den USA (3) angezeigt werden können.

Ich versuche, eine Abfrage durchzuführen, die mir anhand der Einstellungen in der Herstellertabelle mitteilt, wo das Produkt angezeigt werden kann.

In der Herstellertabelle gibt es beispielsweise zwei Felder mit den Namen expose_new und expose_used, die jeweils den Wert 1,2 oder 3 haben, um zu begrenzen, wo ihre neuen oder verwendeten Videos angezeigt werden.

Wenn die Videos hinzugefügt werden, wird ihnen kein "Expose" -Wert zugewiesen. Dies soll im laufenden Betrieb erfolgen, wenn sie in Abhängigkeit von den expose_new- oder expose_used-Werten des aktuellen Herstellers zu unserem Index hinzugefügt werden.

Was ich versuche zu erhalten, sind die Artikeldetails und der berechnete Wert, für den sie angezeigt werden können, basierend darauf, ob es neu oder gebraucht ist, und die Regel / der Wert, die dem Hersteller für alle neuen oder gebrauchten Produkte zugewiesen wurden. Ich benötige diese einzelne Ziffer pro Produkt, um sie bedingt in einer Liste anzuzeigen.

Das Folgende funktioniert nicht, aber Sie werden eine Vorstellung davon bekommen, was ich versuche zu tun. Ich habe dies mit CASE-Anweisungen und der folgenden WRONG IF / ELSEIF-Anweisung versucht.

Jede Hilfe, um dies zu debuggen und mich in die richtige Richtung zu weisen, wäre dankbar.

SELECT 
t2.company_name,
t2.expose_new,  // 1,2 or 3
t2.expose_used, // 1,2 or 3
t1.title,
t1.seller,
t1.status,  //can be new or used
(SELECT 
IF(status ='New',
  (select expose_new from manufacturers where id = t1.seller),1
)
ELSEIF(t1.status ='Used',
  (select expose_used from manufacturers where id = t1.seller),1
)
END IF
) as 'expose'
FROM `products` t1
join manufacturers t2 on t2.id = t1.seller
where t1.seller = 4238

Hier ist eine CASE-Version, die tatsächlich ausgeführt zu werden scheint, aber immer den ersten Wert ergibt, unabhängig davon, was wahr ist (in diesem Fall 1). Ich bin nicht sicher, ob ich in jeder WHEN-Anweisung einen weiteren Test mit dem UND hinzufügen kann, aber es gibt keinen Fehler, nur das falsche Ergebnis.

SELECT 
t2.company_name,
t2.expose_new,
t2.expose_used,
t1.title,
t1.status,
 CASE status
   when 'New' and t2.expose_new = 1 then 1
   when 'New' and t2.expose_new = 2 then 2
   when 'New' and t2.expose_new = 3 then 3
   when 'Used' and t2.expose_used = 1 then 1
   when 'Used' and t2.expose_used = 2 then 2
   when 'Used' and t2.expose_used = 3 then 3
END as expose
FROM `products` t1
join manufacturers t2 on t2.id = t1.seller
where t1.seller = 4238

Hier ist eine sehr gute Ressource auf MySQL, wenn sonst, case Anweisung. Alle werden anhand von Beispielen erläutert.
RN Kushwaha

Antworten:


136

Versuchen Sie diese Abfrage -

SELECT 
  t2.company_name,
  t2.expose_new,
  t2.expose_used,
  t1.title,
  t1.seller,
  t1.status,
  CASE status
      WHEN 'New' THEN t2.expose_new
      WHEN 'Used' THEN t2.expose_used
      ELSE NULL
  END as 'expose'
FROM
  `products` t1
JOIN manufacturers t2
  ON
    t2.id = t1.seller
WHERE
  t1.seller = 4238

ein Kreuz Q - wäre die Abfrage FROM products t1, manufacturers t2 where t2.id = t1.seller and t1.seller = 4238dieselbe? Dies ist nur eine linke Verbindung, nicht wahr?
Hintergedanke

1
Es stellte sich heraus, dass ich beim Experimentieren einen Weg gefunden habe, CASE ... CASE zu verwenden, wenn status = 'New' und t2.expose_new = 1, dann 1, wenn status = 'New' und t2.expose_new = 2, dann 2 usw. Es scheint Wenn ich einfach CASE ohne Feld anmelde, kann ich sie in jeder when-Anweisung definieren und es funktioniert.
user409858

1
Wie exposein welchem ​​Zustand zu verwenden?
NullPointer

Lieber NullPointer Kannst du mein Problem lösen? Kann ich mit case eine andere Tabelle verbinden? etwas wie das. Wählen Sie Datum, Name, Code und Typ aus SONST NULL ENDE AUS Bestellung AS o
Syed Arif Iqbal

19

Syntax:

CASE value WHEN [compare_value] THEN result 
[WHEN [compare_value] THEN result ...] 
[ELSE result] 
END

Alternative: FALL WENN [Bedingung] DANN Ergebnis [WENN [Bedingung] DANN Ergebnis ...]

mysql> SELECT CASE  WHEN 2>3 THEN 'this is true' ELSE 'this is false' END; 
+-------------------------------------------------------------+
| CASE  WHEN 2>3 THEN 'this is true' ELSE 'this is false' END |
+-------------------------------------------------------------+
| this is false                                               | 
+-------------------------------------------------------------+

Ich benutze:

SELECT  act.*,
    CASE 
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NULL) THEN lises.location_id
        WHEN (lises.session_date IS NULL AND ses.session_date IS NOT NULL) THEN ses.location_id
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date>ses.session_date) THEN ses.location_id
        WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date<ses.session_date) THEN lises.location_id
    END AS location_id
FROM activity AS act
LEFT JOIN li_sessions AS lises ON lises.activity_id = act.id AND  lises.session_date >= now()
LEFT JOIN session AS ses ON  ses.activity_id = act.id AND  ses.session_date >= now()
WHERE act.id

1

Eine andere Möglichkeit hierfür ist die Verwendung verschachtelter IF-Anweisungen. Angenommen, Sie haben eine Firmentabelle und möchten die Anzahl der Datensätze darin zählen. Eine Beispielabfrage wäre ungefähr so

SELECT IF(
      count(*) > 15,
      'good',
      IF(
          count(*) > 10,
          'average',
          'poor'
        ) 
      ) as data_count 
      FROM companies

Hier funktioniert die zweite IF-Bedingung, wenn die erste IF-Bedingung fehlschlägt. Die Beispielsyntax der IF-Anweisung wäre also IF (CONDITION, THEN, ELSE). Hoffe es hilft jemandem.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.