Mysql-试图在一个联盟中只获得一个结果
我试图做的是查询数据库,根据所选的网站语言获取我的网站的所有频道。因此,数据库中有一个表,用于所有通道。第二个表根据内容分配给的语言保存所有频道内容。假设我想要一个频道有英文和西班牙文版本,那么频道表中只有一条记录,然后在channel_local表中有两个条目,都有来自主频道表的相同频道id,但有一个条目有英文版本的频道,第二个条目有西班牙文版本的频道。我如何查询主频道表,并根据为站点选择的当前语言,从channel_local表中获取该频道的语言版本,但如果未找到结果,则在一次查询中默认为站点的默认语言?我原以为一个工会会管用,但它有英文版和西班牙文版。以下是查询:Mysql-试图在一个联盟中只获得一个结果,mysql,union,multilingual,Mysql,Union,Multilingual,我试图做的是查询数据库,根据所选的网站语言获取我的网站的所有频道。因此,数据库中有一个表,用于所有通道。第二个表根据内容分配给的语言保存所有频道内容。假设我想要一个频道有英文和西班牙文版本,那么频道表中只有一条记录,然后在channel_local表中有两个条目,都有来自主频道表的相同频道id,但有一个条目有英文版本的频道,第二个条目有西班牙文版本的频道。我如何查询主频道表,并根据为站点选择的当前语言,从channel_local表中获取该频道的语言版本,但如果未找到结果,则在一次查询中默认为站
SELECT * FROM (SELECT
channel_local.channelid,
channel_local.channelname,
channel.channelorder
FROM channel
INNER JOIN channel_local ON
channel.id = channel_local.channelid
WHERE channel.active = 1
AND channel_local.languageid = {currentlanguageid}
UNION
SELECT
channel_local.channelid,
channel_local.channelname,
channel.channelorder
FROM channel
INNER JOIN channel_local ON
channel.id = channel_local.channelid
WHERE channel.active = 1
AND channel_local.languageid = {defaultlanguageid})
AS channels
结果是:
第一频道英文版
第一频道西班牙文版
第二频道英文版
我想要的结果是
第一频道英文版
第二频道英文版
如果当前语言为西班牙语,则我希望得到以下结果:
第一频道西班牙文版
第2频道英文版,因为没有西班牙语版本
第二频道
那怎么办
SELECT * FROM channel_local
WHERE channelid IN (
SELECT channelid FROM channel
WHERE languageid={default language selector} AND active=1
)
只需从通道表中该通道所在的通道_local中选择所有,并且该通道处于活动状态
或者
如果活动字段位于channel_local表中,则可以将
SELECT * FROM channel_local
WHERE active=1 AND channelid IN (
SELECT channelid FROM channel
WHERE languageid={default language selector}
)
这种关联子查询可能会更快,而不是执行多个连接(很快就会变得非常混乱) 对于完整的联合,您可以执行以下操作:
选择频道\本地,频道。从channel_local,channel where channel.channelid=channel_local.channelid和channel_local.channelid中选择channelid from channel where languageid='eng'和active=1按英语优先顺序排列,我想两个选择上的限制值都应该为1。在SQL Server中,可以使用GROUP BY进行此操作,但我不知道如何在MySQL中对top N进行分组。我尝试了GROUP BY,问题是首先出现了对defaultlanguageid的查询。不知道这是否适用于我正在寻找的内容。基本上,我想选择分配给站点上选择的当前语言的条目。因此,如果西班牙语为西班牙语选择channel_local中的条目。但是,如果没有西班牙语版本,它将默认为英语。
SELECT * FROM channel_local
WHERE active=1 AND channelid IN (
SELECT channelid FROM channel
WHERE languageid={default language selector}
)