Mysql查询的情况
我有一张桌子,里面有各种语言 桌子 蓝菜|蓝菜|兰菜|兰菜|兰菜|兰菜|兰菜|兰朗Mysql查询的情况,mysql,Mysql,我有一张桌子,里面有各种语言 桌子 蓝菜|蓝菜|兰菜|兰菜|兰菜|兰菜|兰菜|兰朗 ---------------—————————————————————— 1 | nl | 8 | 1 4 | fr | 8 | 0 我需要检查$\u会话['lang']中的语言是否在表中可用,否则它必须使用主语言 不幸的是,当运行下面的查询时,他返回带有FR和NL als lan\u dish\u lan的行。。。在这种情况下,它只需返回带有FR的行 SELECT * FROM `language_dish`
---------------——————————————————————
1 | nl | 8 | 1
4 | fr | 8 | 0
我需要检查
$\u会话['lang']
中的语言是否在表中可用,否则它必须使用主语言
不幸的是,当运行下面的查询时,他返回带有FR和NL als lan\u dish\u 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
这里有两种可能适合你的方法
/*
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:=@rn+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
您问过,3小时后,当where子句中的case语句得到满足时,SQL不会停止读取行,并且由于where子句对这两行的计算结果都为true,因此这两行都会返回。我知道了,但这不是必需的结果。如果栏lan_dish_lang中有FR的行存在,则需要显示该行。否则,如果它不存在,它需要为特定的lan\u dish\u dishid显示lan\u dish\u mainlang=1的行。我希望你能理解…我很激动-我发布的样本数据的预期结果是什么?我得到的是带有FR的行。好的,但如果带有FR的行不存在,它需要显示我的样本数据lan_dish_ID5中列lan_dish_mainlang=1找不到FR并返回nl的行,这不正确吗?我明白了,但6的原因是什么?这不是FR,也不是主语
+-------------+---------------+
| lan_dish_id | lan_dish_lang |
+-------------+---------------+
| 6 | de |
| 4 | fr |
| 5 | nl |
+-------------+---------------+
3 rows in set (0.01 sec)