2014-02-20 4 views
2

У меня есть тестер таблицы, который имеет первичный идентификатор и внешний ключ, который ссылается на идентификатор таблицы, называемой тестом.Mysql count, join и dual совместно

В тестовой таблице имеется столбец numAllowed, который показывает, сколько человек может пройти этот конкретный тест.

Я хочу вставить новый тестер, тестовый столбец которого ссылается на тест, только если есть меньше тестеров, которые также ссылаются на один и тот же тест, чем numAllowed для этого конкретного теста. Ex, «Alex», тестировщик, может пройти тест «География», если его принимают или уже приняли менее 20 человек (numAllowed).

Кроме того, как функция count работает в таком запросе? Учитывает ли он только столбцы, которые включены в соединения, или это «область действия» вне запроса? будет ли он возвращать счет всех идентификаторов в этой таблице?

insert into tester (test, createddate, ipaddress) 
    select 
     11, NOW(), xxx.xxx.xxx.xxx 
    from 
     dual 
    where exists 
    (select * from 
     test ts inner join 
     tester tr 
     on tr.test = ts.id 
     where ts.numAllowed - count(tr.id) > 0 
     and ts.id = '11') 
+0

что у вас есть в вашей «двойной» таблице? – fthiella

+0

Ничего, это для выбора ваших собственных значений, насколько я знаю. –

+0

Не знаю, поддерживается ли dual mySQL, но я уверен, что вы не можете использовать агрегированные функции, такие как count() в предложении WHERE. Вам нужно сгруппировать данные и использовать предложение HAVING. – scraatz

ответ

1

Я хотел бы написать запрос, как это:

INSERT INTO tester (test, createddate, ipaddress) 
SELECT 
    test.ID, NOW(), 'xxx.xxx.xxx.xxx' 
FROM 
    test 
WHERE 
    test.ID = 1 
    AND EXISTS (SELECT COUNT(*) 
       FROM tester 
       WHERE tester.test = test.ID 
       HAVING test.numAllowed-COUNT(*)>0); 

Пожалуйста, смотрите скрипку here.