当限制达到4时更改SQL查询

时间:2015-06-26 02:30:24

标签: php mysql sql

我的网站上有PHP的投资组合,在这个投资组合中我有3个画廊。在投资组合页面中,我有画廊的预览,每个画廊有4张图片。我得到了一个带来图像的查询,但它在3个画廊中给我带来了相同的图像,而不是在不同的画廊中给我带来不同的图像(因为画廊不同)。

我得到了列画廊和主题,我想对所有内容进行select查询,当它达到4个第一个图像的画廊1时,它会进入第一个画廊中的两个。

一个例子:

$galeria_1 = $conexao->consultarDados("select * from portfolio where gal = 1 and theme = '{$tem}' limit 4"); //i want to make the query so when it reaches the four results, it search the same but with gal = 2;

2 个答案:

答案 0 :(得分:1)

假设您有一个如下所示的表:

create table portfolio (
  gal numeric,
  theme numeric,
  val numeric
);

看起来像这样的数据:

insert into portfolio values (1,10,1);
insert into portfolio values (1,10,2);
insert into portfolio values (1,10,3);
insert into portfolio values (1,10,4);
insert into portfolio values (1,10,5);

insert into portfolio values (2,10,1);
insert into portfolio values (2,10,2);
insert into portfolio values (2,10,3);
insert into portfolio values (2,10,4);
insert into portfolio values (2,10,5);

insert into portfolio values (3,10,1);
insert into portfolio values (3,10,2);
insert into portfolio values (3,10,3);
insert into portfolio values (3,10,4);
insert into portfolio values (3,10,5);

insert into portfolio values (4,10,1);
insert into portfolio values (4,10,2);
insert into portfolio values (4,10,3);
insert into portfolio values (4,10,4);
insert into portfolio values (4,10,5);

您可以运行如下查询:

select *
from (
  select p.*
  , (@rowNum:=Case when @lastGal=p.gal then @rowNum+1 else 1 end) as rowNumber
  , (@lastGal:=p.gal) as currentGal
  from portfolio p, (SELECT @rowNum := 0, @lastGal := 0) r
) q
where rowNumber <= 4
order by gal, val;

SQLFiddle:http://sqlfiddle.com/#!9/ecf65/1

SELECT @rowNum := 0, @lastGal := 0加入查询以创建两个变量:@rowNum用于存储行号,@lastGal用于上一行的图库编号。如果当前图库与最后一行相同,我们会增加行号,否则我们将其重置为1.

这模拟了SQL Server中可用的row_number() over Partition功能,但不能模拟MySQL中的功能。它为每个组中的每一行分配一个数字(其中一个组是一个库的行集),然后WHERE子句限制结果,以便只显示每个组的前四个行号。

答案 1 :(得分:0)

你可以做一个for循环,迭代3个画廊的12个图像,不知道这是你正在寻找的

$j = 1;
for($i = 1; $i <= 12; $i++){
    if($j == 1){//first time
         $galeria_1 = $conexao->consultarDados("select * from portfolio where gal = \''.$j.'\' and theme = '{$tem}' limit 4");
         $j++;

         //do stuff with four images gal 1

    } else if($i%4){
         $galeria_1 = $conexao->consultarDados("select * from portfolio where gal = \''.$j.'\' and theme = '{$tem}' limit 4");
         $j++;

         //do stuff four images gal x

    }        
}