2

バーコードで結合されたマシンの数を返すために使用される次のクエリがあります。それらは、ラインのバーコードによって結合されます。問題は、マシンが複数の行でチェックされる可能性があり、マシンがチェックされた最後の行のバーコードが必要なことです。

例: バーコード 882102 のマシンがライン 99201009 でチェックされました。クエリは、ライン上でこのバーコードを持つマシンの正確な数を返しますが、同じマシンがバーコード 22212302 のラインに移動した場合、クエリは次の 2 つの行を返します。それぞれの行。99201009 行をスキップして 22212302 を取得する必要があります。

クエリは次のとおりです。

SELECT rountingCode, nameBg, count(scanlog.machinebarcode) AS count 
FROM machines 
    LEFT JOIN scanlog ON scanlog.machinebarcode = machines.barcode 
              AND scanlog.linebarcode = $barcode 
ORDER BY routingCode, nameBg GROUP BY routingCode, nameBG

私は何かを間違えたかもしれないので、ここに codeigniter からの元のクエリがあります。

$this->db->select
  ("rountingCode, nameBg, count(scanlog.machinebarcode) AS count")->
    join("scanlog", "scanlog ON scanlog.machinebarcode = machines.barcode 
    AND scanlog.linebarcode = ".$barcode,"left")->
  order_by("routingCode")->
  group_by("routingCode, nameBg")->get("machines")->result();


ScanLog Schema
--------------
LogId
LineBarcode
ScanDate

Machines Schema
----------------
MachineId
FaNo
Barcode
Routingcode
NameBg




これで、クエリはマシンごとに異なる行を返します。
linebarcode を 99201009 に設定すると、クエリは、linebarcode = 99201009; の scanLog にレコードがあるマシンごとに異なる行を返します。
この問題は、一部のマシンバーコードが別の行でチェックされ、別の行で古いチェックが行われている場合に発生します。その場合、クエリは 1 台のマシンに対して多くの行を返します。マシンごとに 1 行が必要です。しかし、私が言ったように、マシンが別の行でチェックされ、前のレコードが削除されていない場合、問題が発生し、マシンごとに 1 つの結果が表示され、より多くの結果が得られます。
このように言いましょう:
マシン 882102 は、最初に 99201009 で 3 回チェックされました。
つまり、この行にこれらのマシンが 3 台あるという
ことですcount3;
今のところすべて問題ありません。
しかし、バーコード 882102 を持つ 2 台のマシンがバーコード 22212302 を持つ別の行に移動すると、クエリはcount= 2, count=を返しますが1、これは私のプログラムにとっては間違っています。
22212302 行をリクエストしたので、count=のみを取得する必要があり2ます。

4

1 に答える 1

0

これを試して

SELECT rountingCode, nameBg, count(scanlog.machinebarcode) AS count 
FROM machines 
    LEFT JOIN scanlog ON scanlog.machinebarcode = machines.barcode 
WHERE scanlog.linebarcode = $barcode
ORDER BY routingCode, nameBg GROUP BY routingCode, nameBG

または、単純に INNER JOIN を使用することもできます。

アップデート

select m.rountingCode,m.nameBg,
       CASE
         WHEN temp.rountingCode IS NULL THEN 0
         ELSE count
       END count
from machines m
left join
(
SELECT machineid,rountingCode, nameBg, count(scanlog.machinebarcode) AS count 
FROM machines 
    LEFT JOIN scanlog ON scanlog.machinebarcode = machines.barcode 
WHERE scanlog.linebarcode = $barcode
GROUP BY routingCode, nameBG) temp
on temp.machineid=m.machineid
order by m.rountingCode,m.nameBg
于 2013-09-12T14:11:11.023 に答える