Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 5.7-从子选择中获取多个值_Mysql - Fatal编程技术网

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