2012-06-12 269 views
2

我有这样两个表:需要帮助创建SQL查询

CREATE TABLE `workers` (
    `id` int(7) NOT NULL AUTO_INCREMENT, 
    `number` int(7) NOT NULL, 
    `percent` int(3) NOT NULL, 
    `order` int(7) NOT NULL, 
     PRIMARY KEY (`id`) 
); 
CREATE `data` (
    `id` bigint(15) NOT NULL AUTO_INCREMENT, 
    `workerId` int(7) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

我想(通过order ASC顺序)返回第一个工人,他的表中的行数datapercent(从表workers)/100小于number(从表workers

我曾尝试此查询:

SELECT workers.id, COUNT(data.id) AS `countOfData` 
FROM `workers` as workers, `data` as data 
WHERE data.workerId = workers.id 
    AND workers.percent * `countOfData` < workers.number 
LIMIT 1 

但我得到的错误:

#1054 - Unknown column 'countOfData' in 'where clause' 
+0

呃,如果不是这样的MySQL,请用适当的RDBMS标记它。 –

+1

您不应该将'order'作为列名称,因为它是大多数SQL中的关键字。 – JHS

+0

它是mysql .... Juniad - 忽略名称 - 我们称它为'sortOrder' - – Nir

回答

1

这应该工作:

SELECT A.id 
FROM workers A 
LEFT JOIN (SELECT workerId, COUNT(*) AS Quant 
      FROM data 
      GROUP BY workerId) B 
ON A.id = B.workerId 
WHERE (COALESCE(Quant,0) * `percent`)/100 < `number` 
ORDER BY `order` 
LIMIT 1 
+0

谢谢 - 它的工作正常..但如果'order'中的工作人员没有'data'表中的记录,查询应该会让他重新找回。但它返回空结果 – Nir

+0

@Nir - 我更新了我的答案,以考虑您的问题。我还删除了“ORDER”条款 – Lamak

+0

上的'DESC',它非常棒!谢谢! – Nir

0

你可以计算子查询每个工人的行数。子查询可以连接到worker表。如果使用left join,没有数据行的工作人员将被视为:

select * 
from workers w 
left join  
     (
     select workerId 
     ,  count(*) as cnt 
     from data 
     group by 
       workerId 
     ) d 
on  w.id = d.workerId 
where coalesce(d.cnt, 0) * w.percent/100 < w.number 
order by 
     w.order 
limit 1 
+0

谢谢 - 它的工作好吧..但如果工人在'订单'1在数据表上没有记录,查询应该让他回头。但它返回空结果 – Nir

+0

已更新答案,所以它应该返回一个没有记录在数据表中的工人 – Andomar

+0

这也工作得很好!谢谢! – Nir