Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL select statement with CASE or IF ELSEIF? Not sure how to get the result

Tags:

select

mysql

case

I have a two tables. One has manufacturer information and includes the regions where they can sell. The other has their products for sale. We have to limit visibility of the product based on the regions. This is like Netflix have videos in their system that can only be viewed Everywhere (1), only in Canada (2), only in USA (3).

I am trying to make a query that tells me where the product can be viewed based on the settings in the manufacturer table.

For example, in the manufacturer table, there are two fields called expose_new and expose_used each of which will have a value of 1,2 or 3 to limit where their new or used videos can seen.

When the videos are added, they are not assigned an 'expose' value and this is meant to be done on the fly when adding them to our index depending on the current manufacturer's expose_new or expose_used values.

What I am trying to get is the item details and the computed value for where it can be seen based on whether it is new or used and the rule/value assigned to the manufacturer for all their new or used products. I need this single digit on a per-product basis to conditionally display it in a list.

The following does not work, but you will get the idea of what I am trying to do. I have tried this with CASE statements and the following WRONG IF/ELSEIF statement.

Any help to debugger this and point me in the right direction would be appreciated.

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 

Here is a CASE version that actually seems to execute but always results in the first value no matter what happens to be true (in this case 1). I am not sure that I can have the addition of another test with the AND in each WHEN statement but it does not give an error, only the wrong result.

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 
like image 889
user409858 Avatar asked Dec 22 '11 07:12

user409858


People also ask

Can we use if statement in select query in MySQL?

Answer: MySQL IF() function can be used within a query, while the IF-ELSE conditional statement construct is supported to be used through FUNCTIONS or STORED PROCEDURES.

Is Select Case faster than if then?

case should be faster, because it's a lookup table (as most often implemented by the compiler). However, if you're worried about which of these runs faster, and it's really the bottleneck in your program, you have a phenomenally-well-behaved project.


1 Answers

Try this query -

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 
like image 85
Devart Avatar answered Sep 19 '22 17:09

Devart