次の形式のテーブルがあるとします。
ID Value Data
1 A
1 B
1 C
2 Q
2 J
3 D
クエリを返したい...
A (3 total)
Q (2 total)
D (1 total)
というわけで、タイトルの通り、ID値に変化があったので初めて「Data」の値を取得したいと思います。1 の ID 値が 3 つあり、Data の最初の値が A であるため、A を返します (合計 3 つ)。2のID値が2つあり、Dataの最初の値がQなので、Q(合計2)などを返します。
私はウェブサイトでこれを行っているので、印刷方法には少し自由があります。私は現在 2 つのクエリを実行しており、単純な printf を使用してそれらを一緒に出力しています (実際のデータには、上記の例よりも多くのデータ列があります)。
$sql = "SELECT COUNT(VIN)
AS vinCount
FROM TestTable
WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')
GROUP BY WorkOrderNumber";
この例では、WorkOrderNumber が ID 値の役割を果たし、VIN の数を合計しようとしています。
これにより、毎回正しい数 (たとえば「合計 3」) が確実に取得されます。
私の本当の問題は、最初の行の値 (上記の例では A、Q、D) を取得することです。問題は、事前にそれらが何であるかがわからないため、「where WorkOrderNumber =」ステートメントを使用できないことです。それらはユーザーが生成したものなので、調べなければなりません。
私が見落としているものはありますか?これは私が最初に試したクエリで、明らかに機能しません。
$sql = "SELECT FIRST (JobStage + ' ' + WorkItem + ' ' + VIN + ' ' + Make + ' ' + Model + ' ' + ExColor)
AS WorkSelection
FROM TestTable
WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')";
これに追加できる WHERE 句のようなものはありますか?これは論理的に「これが WorkOrderNumber の前に見られなかった値である場合は、それを取得する」と同等ですか?
編集:私はこれをやってしまった....
//Grab number of cars
$sql = "SELECT COUNT(VIN)
AS vinCount
FROM TestTable
WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')
GROUP BY WorkOrderNumber";
$number = odbc_exec($connection, $sql);
//Grab car description
$sql = "SELECT (tmp.JobStage + ' ' + WorkItem + ' ' + VIN + ' ' + Make) AS WorkSelection
FROM ( SELECT JobStage, WorkItem, VIN, Make FROM TestTable WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')) AS tmp";
$rs = odbc_exec($connection, $sql);
while(odbc_fetch_row($number)){
odbc_fetch_row($rs);
odbc_fetch_row($rs);
$count = odbc_result($number, 'vinCount');
$row = odbc_result($rs, 'WorkSelection');
//$row = odbc_result($rs, 'WorkSelection');
printf("<option value='%s'>(%s other cars) %s</option>", $row, $count, $row);
}
それを 2 つのクエリに分割して、まとめて出力するだけです。