2

我有以下查询,该查询用于返回由条形码连接的机器数量。它们由线路的条形码连接。问题是我可能在几行上检查了机器,我需要检查机器的最后一行条形码;

示例:在第 99201009 行检查了带有条形码 882102 的机器。查询将返回在线上带有此条形码的机器的确切数量,但如果同一台机器被移动到带有条形码 22212302 的行,查询将给我两行每一行。我需要跳过第 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 个结果,我会得到更多。
可以这样说:
机器 882102 首先在 99201009 处检查了 3 次。
这意味着我在这条线上有 3 台这样的机器
查询会给我count=3;
现在一切都很好。
但是,当条形码为 882102 的两台机器移动到条形码为 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 回答