【问题标题】:SQL Server join the lastSQL Server 加入最后一个
【发布时间】:2013-09-16 22:11:28
【问题描述】:

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

例子: 在第 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 台这样的机器
查询会给我count = 3;
目前一切正常。
但是,当带有条形码 882102 的两台机器移动到带有条形码 22212302 的另一行时,查询将给我count = 2count = 1,这对我的程序来说是错误的。
我请求了第 22212302 行,所以我只能得到 count = 2

【问题讨论】:

  • 您的表格中是否有 date_scanned 列或类似内容?使用表的架构和所需的结果集示例会更容易理解您想要什么。
  • 是的,我有一个日期时间格式的 ScanDate 字段。我会在一分钟内用架构更新问题:)
  • 更新了问题:)
  • 您能否也添加一个您想要的结果集样本,以及您目前得到的结果。不知何故,我无法理解您想要实现的目标。
  • 这对我来说有点难以解释,英语不是我的母语,对此感到抱歉,但我更新了问题并试图在底部进行解释。 :)

标签: php sql-server codeigniter join


【解决方案1】:

试试这个

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

【讨论】:

  • 这对我来说有点用,但问题是我有一个很大的 html 表,我填充了它,所以我需要把每台机器都放在那个表上,即使它不存在于那一行,在这种情况下,我为此机器计数打印零。 ://
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多