2012-06-12 214 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