2013-12-07 4 views
2

Я только начинаю с mySql и задаюсь вопросом, почему мой вопрос, связанный с вопросом 8 на этом веб-сайте: http://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial не работает.Извлечь из года в год запрос

Я пытался сделать это:

SELECT DISTINCT yr FROM 
(SELECT * FROM nobel WHERE NOT subject = 'Chemistry') AS x 
WHERE subject = 'Physics' 

Объяснение было бы великолепно, я уже нашел способы запросов, которые работают, но я хотел бы видеть, где моя логика не подводила меня.

+0

не работает средство? Также укажите данные и ожидаемый результат. Поместите всю информацию, необходимую в вопросе. –

+0

@juergend, вся информация, необходимая ** ** в вопросе – svz

+0

@svz: Нет, вопросы должны быть самостоятельными и независимыми по внешним ссылкам. –

ответ

1

Уловка находится в подзапросе: SELECT * FROM nobel WHERE NOT subject = 'Chemistry'. Он выбирает все строки, где субъект не является химией. Строки, но не годы. Поскольку существует много номинаций на Нобелевскую премию каждый год, вы все равно получите список всех лет в своем выборе.
После этого вы проверяете строки с физикой, которые присутствуют почти каждый год и получают неправильный ответ.

Интересно, если люди здесь когда-либо читал на вопросы ..

+0

Большое спасибо, теперь это начинает иметь смысл. :) – user3077283

+0

Вот как я, наконец, сделал это с моими примитивными знаниями до сих пор.Спасибо за указатель SELECT DISTINCT FROM YR Nobel WHERE NOT IN год (SELECT DISTINCT FROM YR Nobel WHERE Subject = 'Химия') И Subject = 'Физика' – user3077283

+0

@ user3077283, Вы радушны. – svz

1

Вы можете сделать подзапрос с NOT EXISTS просить за годы, которые имеют премию по физике и не имеют приз химии:

SELECT DISTINCT yr FROM 
nobel n1 WHERE subject = 'Physics' 
AND NOT EXISTS (SELECT 1 
       FROM nobel n2 
       WHERE n1.yr = n2.yr 
        AND subject = 'Chemistry') 

EDIT:

Глядя на ваш запрос, вот почему он не работает:

Если вы имели:

1960 Chemistry Willard F. Libby 
1960 Physics  Saint-John Perse 
1961 Chemistry Sir Frank Macfarlane Burnet 
1961 Physics  Peter Medawar 

Ваш подзапрос возвратит:

1960 Physics  Saint-John Perse 
1961 Physics  Peter Medawar 

Затем с помощью внешнего запроса вы хотите, те, которые имеют предмет физики, которые дадут вам все результаты.

Для того, чтобы он работал, вам нужно связать год, когда физика выиграла, а химия не была присуждена.

0

Вы можете попробовать это:

SELECT distinct yr FROM 
nobel x1 WHERE subject = 'Physics' 
AND NOT EXISTS (SELECT 1 FROM nobel x2 WHERE x1.yr = x2.yr 
         AND subject = 'Chemistry') 

WORKING DEMO

Ваш подзапрос SELECT * FROM nobel WHERE NOT subject = 'Chemistry' будут выбраны все строки из таблицы, в которой субъект не равен Chemistry, но вы хотите проверить только там существование. Таким образом, вы можете заменить * with 1.

+1

Ваш совет по замене * на 1 не имеет смысла в запросе OP. –

1

Другим решением было бы

select yr 
from nobel 
group by yr 
having sum(subject = 'Chemistry') = 0 
and sum(subject = 'Physics') >= 1 
Смежные вопросы