1

配列に表示したい3つの異なるテーブルからすべてのタイプのデータを取得するSQLクエリがあります。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ページ目などです。各ページには、すべてのクライアントのリストと、ページごとに 1 つの注文値のみが含まれます。ユーザーは注文フィールドに独自のテキストを入力できるため、注文列の値はユーザーごとに異なります。これは可能ですか?もしそうなら、どうすれば最善の方法ですか?

@Gordon Linoff ここに私の現在のクエリがあります。あなたが何を書いたか、またはそれが私の質問にどのように関連するかについて、私は本当に理解していません. 以下は私の現在のクエリです。配列への出力が完了していません。必要な結果が得られるまでテストしていたので、これを持っています。

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

これが私の新しいクエリです。最初の部分は問題なく動作しますが、サブクエリが問題を引き起こしています。結果を引き出していません。@ゴードンリノフ

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); 
}
4

2 に答える 2

1

クエリにページ番号を追加することで問題を解決できると思います。残念ながら、これは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

これはほとんど機能します。。。注意点が1つだけです。同じ名前の列が複数あるため、with句に「SELECT*」を入れることができます。必要な列を入力します。

mysqlが「with」ステートメントをサポートしていないことを忘れています。構文が間違っていることをお詫びします。回避策の1つは、ビューまたは一時テーブルを使用することです。それ以外の場合、ロジックを2回繰り返す必要があるため、クエリは少し複雑になります。

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
于 2012-08-08T02:01:50.743 に答える
1

これを試して。注文の最大値にはサブクエリを使用します。

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'
于 2012-08-07T23:53:53.177 に答える