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
Antworten:
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
quelle
FROM products t1, manufacturers t2 where t2.id = t1.seller and t1.seller = 4238
dieselbe? Dies ist nur eine linke Verbindung, nicht wahr?expose
in welchem Zustand zu verwenden?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
quelle
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.
quelle