我有一个 sql 查询,它从我现在想要在数组中显示的 3 个不同表中提取所有类型的数据。我可以让它输出 sql 查询中的所有数据,但我只想根据表中列的值是否相同,一次显示数组的一部分。将尝试在下面演示。
我的 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);
}
您可以通过在查询中添加页码来解决您的问题。 不幸的是,这在 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
试试这个。它使用子查询作为订单的最大值。
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
或者如果我没记错的话,最简单的
SELECT *
FROM myTable
WHERE `Order` = '1B'