计算记录并从表中选择那些<场价值

时间:2015-05-23 00:14:53

标签: mysql

首先感谢时间。

我在这里要求任何建议。

我有两个表inv和asig如下

wp_localize_script

我有一个查询工作,但我需要扩展它。

实际查询是

jsonarray

我从inv中获得的记录不是预期的

现在我需要的是获取来自inv的所有记录inv.mx< invID出现在asig中的次数。

我想到了这个问题:

inv has invID, name, ans, mx
asig has stuID, invID

并告诉我invID在asig表中的实际时间,所以我尝试在前一个中应用此查询(没有任何运气)

SELECT
inv.invID,
inv.name
FROM invest
WHERE (inv.invID NOT IN (SELECT DISTINCT asig.invID from asig))

当然我收到错误(操作数应包含1列)

我无法将一个数字与两个数字进行比较,但我在这里丢失了。我不知道如何进行这种比较。

赞赏任何提示

编辑>>>

我的asig表有1328条记录,我应该在查询中得到954条。我在excel中执行此操作以验证结果。

invID是一个uniuqe索引并且始终填充。 mx始终是> = 0

4 个答案:

答案 0 :(得分:0)

此查询应该获取所有inv记录及其在asig表中没有记录的mx值,以及inv表中mx值小于记录数的所有记录asig表。

SELECT inv.invID, inv.mx
    FROM inv LEFT OUTER JOIN asig
    ON inv.invID = asig.invID 
    WHERE asig.invID is NULL
UNION  
SELECT inv.invID, inv.mx 
    FROM inv INNER JOIN asig 
    ON inv.invID = asig.invID 
    WHERE asig.invID IS NULL 
    GROUP BY inv.invID
    HAVING COUNT(asig.invID) < inv.mx

答案 1 :(得分:0)

对于每个invID,其在asig中的出现次数为

 select count(*) from asig where indID=@invID

现在你比较它们

 select * from inv where mv < (select count(*) from asig where asig.invID = inv.invID)

答案 2 :(得分:0)

您需要作为派生表加入查询 - 不要将其用作相关子查询。

select inv.*
  from inv
    inner join (
      SELECT invID, COUNT( invID) as number 
        FROM asig 
        group by invID
    ) q
    on inv.invid = q.invid
      and inv.mx < q.number

fiddle demo

答案 3 :(得分:0)

有几种查询模式将返回指定的结果。

假设invID表中的inv是唯一的,您可以使用简单的JOIN操作,GROUP BY计算invID出现的次数asigmx中,并将其与HAVING子句中的 SELECT inv.invID , inv.name FROM inv JOIN asig ON asig.invID = inv.invID GROUP BY inv.invID , inv.name HAVING inv.mx < COUNT(asig.invID) 列进行比较

例如:

invID

注意:此查询取决于inv表中invID是唯一的保证,并且省略了NULLinvID的所有行}。

这是一个可能的查询模式的示例。

修改

此查询不会返回&#34;零计数&#34;对于asig中不会出现mx的{​​{1}}值,如果HAVING可能为负,则会引起关注。

要解决这个问题,我们可以为 HAVING inv.mx < COUNT(asig.invID) OR inv.mx < 0 子句

添加另一个条件
LEFT JOIN

并使加入成为&#34;外部&#34;通过指定JOIN代替location.html.erb来加入。