显示来自mysql查询的部分结果

问题描述:

我有一个sql查询,它从3个不同的表中抽取所有类型的数据,我现在想在数组中显示这些数据。我可以从sql查询中输出所有数据,但我只想根据表中列的值是否相同来一次显示数组的一部分。下面将尝试演示。显示来自mysql查询的部分结果

我的SQL结果看起来是这样的:

Client | Order | Exc1 | Exc2 | Rest | Reps | 
------------------------------------------------------- 
Steve | 1A  | this | That | This | that | 
------------------------------------------------------- 
Mike | 1A  | this | That | This | that | 
------------------------------------------------------- 
Jax  | 1A  | this | That | This | that | 
------------------------------------------------------- 
Steve | 1B  | this | That | This | that | 
------------------------------------------------------- 
Mike | 1B  | this | That | This | that | 
------------------------------------------------------- 
Jax  | 1B  | this | That | This | that | 

我希望我的阵列来输出这在第1页

Steve | 1A  | this | That | This | that | 
------------------------------------------------------- 
Mike | 1A  | this | That | This | that | 
------------------------------------------------------- 
Jax  | 1A  | this | That | This | that | 

这2页等上。每个页面将包含所有客户的列表,每个页面只有一个订单值。每个用户的订单栏值会有所不同,因为他们可以为订单字段输入自己的文本。这是可能的,如果是这样,最好的方式是怎样的?

@Gordon Linoff这里是我目前的查询。我真的不明白你写了什么或更多的与我的查询有关。在我目前的查询ID下面。我没有完成输出到数组中。我在测试之前就拥有了这个功能,直到我获得了我想要的结果。

function get_workout_class(){ 
$workout_class = array(); 

$workout_query = mysql_query(" 
SELECT * 
FROM `movements` 
LEFT JOIN `classes` 
ON `movements`.`class_id` = `classes`.`class_id` 
LEFT JOIN `clients` 
ON `movements`.`class_id` = `clients`.`class_id` 
WHERE `classes`.`class_id` = '$class_id' AND `user_id` = ".$_session['user_id']." 
ORDER BY `movements`.`order`, `clients`.`first_name` 

"); 

}

这里是我的查询结果的屏幕截图,所以你可以看到我是多么希望他们分组。页面按不同的“顺序”值拆分。客户数量因班级而异。

http://custommovement.com/help/query.png

这是我的新的查询。第一部分工作正常,但子查询给我的问题。它不拉任何结果。 @GordonLinoff

function get_workout_class($class_id){ 
$class_id = (int)$class_id; 

$workout_class = array(); 

$workout_query = mysql_query(" 
WITH `workouts` as (
SELECT 
`movements`.`movement_id`, 
`movements`.`order`, 
`movements`.`mv_00`, 
`movements`.`mv_01`, 
`movements`.`mv_02`, 
`movements`.`mv_03`, 
`movements`.`mv_04`, 
`movements`.`rep_set_sec`, 
`movements`.`rest`, 
`classes`.`class_name`, 
`clients`.`client_id`, 
`clients`.`first_name`, 
`clients`.`last_name`, 
`clients`.`nickname` 
FROM `movements` 
LEFT JOIN `classes` ON `movements`.`class_id` = `classes`.`class_id` 
LEFT JOIN `clients` ON `movements`.`class_id` = `clients`.`class_id` 
WHERE `classes`.`class_id` = '$class_id' 
) 

SELECT `wo`.* 
(SELECT COUNT(DISTINCT `order`) FROM `workouts` `wo2` WHERE `wo2`.`order` <= `wo`.`order`) as `pagenum` 
FROM `workouts` `wo` 
ORDER BY `pagenum` 

"); 

echo mysql_num_rows($workout_query); 
} 
+0

您能告诉我们一些代码吗? – jprofitt 2012-08-07 23:51:39

+1

'WHERE ORDER ='1B''? – 2012-08-07 23:53:29

+0

在网站上搜索“分页” – 2012-08-07 23:54:03

我想你可以通过添加页码查询解决您的问题。不幸的是,这在mysql中是非常痛苦的,因为你必须使用自加入或相关的子查询。

下面是如何与相关子查询做到这一点的例子:

select t.*, 
     (select count(distinct order) from t t2 where t2.order <= t.order) as pagenum 
from t 
order by pagenum 

根据您的原始查询(但不把它变成一个字符串):

with workouts as (
    SELECT * 
    FROM `movements` LEFT JOIN 
      `classes` 
      ON `movements`.`class_id` = `classes`.`class_id` LEFT JOIN 
      `clients` 
      ON `movements`.`class_id` = `clients`.`class_id` 
     WHERE `classes`.`class_id` = '$class_id' AND `user_id` = ".$_session['user_id']." 
    ) 
select wo.*, 
     (select count(distinct order) from workouts wo2 where wo2.order <= wo.order) as pagenum 
from workouts wo 
order by pagenum 

这几乎工作。 。 。只是一个警告。您可以将“SELECT *”放入with子句中,因为您有多个具有相同名称的列。放入你需要的列。

我忘记了mysql不支持“with”语句。我对不好的语法表示歉意。解决办法之一是使用视图或临时表。否则,查询有点复杂,因为逻辑必须重复两次:

select wo.*, 
     (select count(distinct order) 
     from (SELECT * 
       FROM `movements` LEFT JOIN 
        `classes` 
        ON `movements`.`class_id` = `classes`.`class_id` LEFT JOIN 
        `clients` 
        ON `movements`.`class_id` = `clients`.`class_id` 
       WHERE `classes`.`class_id` = '$class_id' AND `user_id` = ".$_session['user_id']." 
      ) wo2 
     where wo2.order <= wo.order 
     ) as pagenum 
from (SELECT * 
     FROM `movements` LEFT JOIN 
      `classes` 
      ON `movements`.`class_id` = `classes`.`class_id` LEFT JOIN 
      `clients` 
      ON `movements`.`class_id` = `clients`.`class_id` 
     WHERE `classes`.`class_id` = '$class_id' AND `user_id` = ".$_session['user_id']." 
    ) wo 
order by pagenum 
+0

我发布了上面的查询以及查询结果屏幕快照的链接,因为我无法弄清楚您的查询将如何转换为我当前的查询。 – Colbyd 2012-08-08 12:49:10

+0

我的理解是,你想用网页把事情分开。所以,这个查询在返回集中添加了一个“pagenum”列。然后你可以选择你想要的任何数据页面。为了使这个工作适合你的查询,只需在这之前添加“with t as()”。 – 2012-08-08 13:07:48

+0

那么你上面写的是否会遵循我最初发布的现有查询? – Colbyd 2012-08-08 13:45:24

试试这个。它使用子查询作为订单的最大值。

SELECT a.* 
FROM myTable a INNER JOIN 
      (
       SELECT Client, 
         Max(`Order`) as MaxOrder 
       FROM myTable 
       GROUP BY Client 
      ) c 
       ON a.Client = c.Client AND 
        a.`Order` = c.MaxOrder 

或simpliest如果我没有记错

SELECT * 
FROM myTable 
WHERE `Order` = '1B' 
+0

我可以从表格中获得确切的值,但我希望所有结果都返回到客户端在类中并显示与该类关联的所有数据。我只想一次显示一个订单值。我认为分页可能是我的答案,但还不确定。 – Colbyd 2012-08-08 00:01:20

+0

哦,是的,所以你想部分显示结果。去'分页:) :) – 2012-08-08 00:02:33

+0

分页我不工作的一件事。当我的查询返回时,显示我所有数据所需的页数将因不同的“订单”值的数量而异。例如,在班级I中可能有1A,1B,1C,1D(4页),另一班可能是1A,1B,1C,1D,1E(5页)。分页仍然有可能吗? – Colbyd 2012-08-08 01:46:51