2017-10-01 72 views
-2

我有语言表情况下,MySQL在哪儿查询

lan_dish_id。| lan_dish_lang | lan_dish_dishid | lan_dish_mainlang
--------------- | ------------------- | --------------------- | ------------------------
                              | NL                                         | 8                                               | 1
                              | FR                                           | 8                                               | 0

我需要检查$_SESSION['lang']中的语言是否在表中可用,否则它必须采用主语言。

不幸的是,当运行下面的查询时,他返回带有FR的行以及NL als lan_dish_lan ...在这种情况下,它只能返回带有FR的行。

SELECT * FROM `language_dish` WHERE 
(CASE 
WHEN lan_dish_lang = "fr" 
THEN lan_dish_lang = "fr" 
ELSE lan_dish_mainlang = 1 
END) AND lan_dish_dishid = 8 
+1

你问[同样的问题,用不同的标题(https://stackoverflow.com/questions/46511749/using-case-in-where-clause) 3小时前 – Mawg

+0

当case语句在where子句中满足时,Sql不会停止读取行,并且您的where子句对两个行的计算结果都为true,则返回两行。 –

回答

1

这里有两种方法可能适合你。

/* 
DROP TABLE IF EXISTS T; 

CREATE TABLE T (lan_dish_id INT, lan_dish_lang VARCHAR(2), lan_dish_dishid INT, lan_dish_mainlang INT); 
*/ 
truncate table t; 
INSERT INTO T VALUES 
(1     , 'nl' , 8,       1) , 
(4     , 'fr' , 8,       0) , 
(5     , 'nl' , 9,       1) , 
(6     , 'de' , 7,       0) 

; 

select s.lan_dish_dishid, left(gc,instr(concat(gc,','),',') -1) lang 
from 
(
select lan_dish_dishid, group_concat(lan_dish_lang order by lan_dish_mainlang) gc 
from t 
#where lan_dish_dishid = 8 
group by lan_dish_dishid 
order by lan_dish_dishid 
) s 
; 
select s.lan_dish_id, s.lan_dish_lang 
from 
(
select t.*, 
     if(t.lan_dish_dishid <> @p , @rn:=1,@rn:[email protected]+1) rn, 
     @p:= t.lan_dish_dishid p 
from t , (select @rn:=0,@p:=0) r 
order by t.lan_dish_dishid, t.lan_dish_Mainlang 
) s where s.rn = 1 

结果

+-------------+---------------+ 
| lan_dish_id | lan_dish_lang | 
+-------------+---------------+ 
|   6 | de   | 
|   4 | fr   | 
|   5 | nl   | 
+-------------+---------------+ 
3 rows in set (0.01 sec) 
+0

我明白了,但这不是必需的结果。如果存在lan_dish_lang列中具有FR的行,则需要显示该行。否则,如果它不存在,它需要显示那个lan_dish_mainlang = 1的那个特定lan_dish_dishid行。我希望你能理解它... –

+0

我都是agog--给出我发布的样本数据的预期结果是什么? –

+0

我收到FR的那一行。好吧,但如果FR行不存在,它需要显示列lan_dish_mainlang = 1 –