Mysql 5.7-从子选择中获取多个值
在下面的查询中,我正在“加入”另一个表,其中Mysql 5.7-从子选择中获取多个值,mysql,Mysql,在下面的查询中,我正在“加入”另一个表,其中I.isPrimary>0,如果所有I.isPrimary都是0,我只得到第一个结果 查询的结果集与预期一致,但我希望从每个子选择中带来更多值。 我收到错误:SQL错误(1241):操作数应包含1列 如何重写此查询以从每个子选择中获得更多结果 谢谢 -- borrowed from https://stackoverflow.com/q/7745609/808921 CREATE TABLE IF NOT EXISTS `ResearchEntity
I.isPrimary>0
,如果所有I.isPrimary
都是0
,我只得到第一个结果
查询的结果集与预期一致,但我希望从每个子选择中带来更多值。我收到错误:
SQL错误(1241):操作数应包含1列
如何重写此查询以从每个子选择中获得更多结果
谢谢
-- borrowed from https://stackoverflow.com/q/7745609/808921
CREATE TABLE IF NOT EXISTS `ResearchEntity` (
`id` int(6) unsigned NOT NULL,
`name` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `ResearchEntity` (`id`, `name`) VALUES
('1', 'one'),
('2', 'two'),
('3', 'three');
CREATE TABLE IF NOT EXISTS `ProfileImageEntity` (
`id` int(6) unsigned NOT NULL,
`isPrimary` int(1) unsigned NOT NULL,
`value` varchar(200) NOT NULL,
`researchId` int(2) unsigned NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `ProfileImageEntity` (`id`,`isPrimary`, `value`,`researchId`) VALUES
('1', 0, 'not primary',1),
('2', 0, 'not primary',1),
('3', 1, 'primary!!!',1),
('4', 0, 'primary!!!',2),
('5', 0, 'not primary',2),
('6', 0, 'not primary',2)
;
CREATE TABLE IF NOT EXISTS `UserNameEntity` (
`id` int(6) unsigned NOT NULL,
`isPrimary` int(1) unsigned NOT NULL,
`value` varchar(200) NOT NULL,
`researchId` int(2) unsigned NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `UserNameEntity` (`id`,`isPrimary`, `value`,`researchId`) VALUES
('1', 0, 'first one, should be returned',1),
('2', 0, 'not primary',1),
('3', 0, 'primary',1),
('4', 1, 'primary',3),
('5', 0, 'not primary',3),
('6', 0, 'not primary',3);
SQL小提琴
:
尝试左连接
SELECT r.*,i.id FROM ResearchEntity r left join ProfileImageEntity i on r.id = i.researchId
ORDER BY i.isPrimary,i.id DESC;
你只需要离开加入2次
SELECT r.*,i.id,j.id FROM ResearchEntity r left join ProfileImageEntity i on r.id = i.researchId left join UserNameEntity j on r.id=j.researchId ORDER BY i.isPrimary,i.id DESC;
我从您的问题和评论中了解到,您希望从子查询中获得更多的列,这是不可能的。因此,请尝试以下查询: 在MySql 8中这很容易,但您使用的是MySql 5.7,其中有点棘手,因此请尝试以下方法:
select
t1.*,
t2.id AS primaryImageId,
t2.value AS primaryImageValue,
t3.id AS primaryUserId,
t3.value AS primaryUserValue
from ResearchEntity t1
left join (
SELECT *,
IF(researchId=@last,@_seq:=@_seq+1,@_seq:=1) AS rn,
@last:=researchId
FROM ProfileImageEntity , (SELECT @_seq:=1, @last:=0) r
ORDER BY researchId,isPrimary DESC, id ASC
) t2 on t1.id=t2.researchId and t2.rn=1
left join (
SELECT *,
IF(researchId=@last,@_seq:=@_seq+1,@_seq:=1) AS rn,
@last:=researchId
FROM UserNameEntity , (SELECT @_seq:=1, @last:=0) r
ORDER BY researchId,isPrimary DESC, id ASC
) t3 on t1.id=t3.researchId and t3.rn=1
order by t1.id
在MySql 8中使用row\u number()
请参见@草莓-添加了您希望从样本数据中获得的输出?@AkhileshMishra-表
ProfileImageEntity
和UserNameEntity
有一列值,我想将其添加到结果中primaryImageId、primaryImageValue primaryUserNameId、primaryUserNameValue
感谢我从您的问题中了解到的内容,并对您希望从子查询中获得更多列的内容进行注释,这是不可能的。这不能用于像我的queryBingo这样的多个联接表。谢谢在mysql8中,这如何更简单?再次感谢!我已经添加了MySql 8的查询。
select
t1.*,
t2.id AS primaryImageId,
t2.value AS primaryImageValue,
t3.id AS primaryUserId,
t3.value AS primaryUserValue
from ResearchEntity t1
left join (
SELECT *,
IF(researchId=@last,@_seq:=@_seq+1,@_seq:=1) AS rn,
@last:=researchId
FROM ProfileImageEntity , (SELECT @_seq:=1, @last:=0) r
ORDER BY researchId,isPrimary DESC, id ASC
) t2 on t1.id=t2.researchId and t2.rn=1
left join (
SELECT *,
IF(researchId=@last,@_seq:=@_seq+1,@_seq:=1) AS rn,
@last:=researchId
FROM UserNameEntity , (SELECT @_seq:=1, @last:=0) r
ORDER BY researchId,isPrimary DESC, id ASC
) t3 on t1.id=t3.researchId and t3.rn=1
order by t1.id
with cte as (
SELECT *,
row_number() over (partition by researchId ORDER BY isPrimary DESC, id ASC) rn
FROM ProfileImageEntity
),
cte1 as (
sELECT *,
row_number() over (partition by researchId ORDER BY isPrimary DESC, id ASC) rn
FROM UserNameEntity
)
select
t1.*,
t2.id AS primaryImageId,
t2.value AS primaryImageValue,
t3.id AS primaryUserId,
t3.value AS primaryUserValue
from ResearchEntity t1 left join cte t2 on t1.id=t2.researchId and t2.rn=1
left join cte1 t3 on t1.id=t3.researchId and t3.rn=1