2011-01-06 3 views
0

У меня есть таблицы и данные, как этотMySQL запросов помощь

id | term_id | name_id 
1 | 4  | 1 
2 | 6  | 1 
3 | 5  | 2 
4 | 6  | 2 
3 | 4  | 3 
4 | 6  | 3 

я хочу запрос, так что я могу получить только те name_id, который имеет 4 и 6 term_id прилагается к нему ... если я запрос 4, 6,2 она не должна показывать мне что-нибудь, потому что ни named_id не прилагается ко всем трем из них или как 4,5 он не должен ничего показывать, потому что не имеет такой же 4 и 5

ответ

2
SELECT Name_ID 
FROM Table1 t 
WHERE term_id IN (4,6) 
GROUP BY NAME_ID 
HAVING COUNT(*) = 2 
+1

, который является «или» заявление, но я хочу некоторые например, показать мне имя id с 4 и 6 не или 4 или 6, потому что если он помещает 4 и 6 и 2, он не должен показывать мне ничего –

+0

Это возвращает имя_ид для двух строк с одинаковыми именами_ид и term_id как 4, '(1,4,2), (2,4,2) '. Это неправильно. – Ishtar

0
select 
     name_id 
    from 
     YourTable 
    where 
     term_id = 4 or term_id = 6 
    group by 
     name_id 
    having 
     count(*) = 2 

чтобы уточнить, что что вам нужно понять, «GROUP BY »и« HAVING ». Группировать, заставляя SQL-запрос группировать как можно больше квалифицированных записей по столбцам, которые он идентифицирует как предложение Group By. Это просто один и тот же столбец в запросе.

Далее, предложение HAVING основано на окончательных результатах группы после того, как все записи предварительно подготовлены и включены. В этом случае он смотрит на COUNT (*) записей, которые имеют квалификацию = 2.

Поскольку вы заинтересованы в том, чтобы данный идентификатор Name_ID был связан с BOTH Условиями 4 и 6, нам нужны имена, где их идентификатор был найдено в BOTH ... Следовательно, условие OR условия WHERE. Нам нужна любая запись, в которой лицо было связано с 4 ИЛИ 6. Если в результате была найдена только одна запись (только 4 или 6), их значение COUNT () было бы равно 1 и, таким образом, было отброшено из набора результатов ... только те, которые квалифицироваться с обоих терминов будет иметь счетчик () = 2 и, таким образом, включены в окончательные результаты ...

Чтобы увидеть, что в противном случае она может выглядеть, попробуйте этот запрос ...

select 
     name_id, 
     count(*) as TotalTermsPerName 
    from 
     YourTable 
    group by 
     name_id 

Вы получите идентификатор имени с минимальным сроком 1 год и другие, которые могут иметь 10 терминов или более на основе ваших данных. Поскольку исходный запрос учитывал только термины 4 и 6, максимальный счет, который должен быть достигнут, должен быть не более 2.

Надеюсь, что это поможет вместо ответа на запрос и не понимает основы того, КАК вещи Работа.

+0

ваш запрос неверен, должен быть помещен после группы по – cristian

+1

, который является оператором «или», но я хочу, чтобы какой-то пример и выражение вроде show me name id с 4 и 6 не или 4 или 6, потому что если он помещает 4 и 6 и 2, не должен показывать мне ничего –

+0

@ user499703, см. пересмотренный ответ для уточнения. – DRapp

0
SELECT DISTINCT name_id 
FROM t 
WHERE 
    term_id = 4 
    AND 
    name_id IN (SELECT name_id FROM t WHERE term_id = 6) 
+0

извините, не то, что я ищу –

1

Это его (если я понимаю, что вы хотите):

SELECT t1.name_id 
FROM table1 t1 
INNER JOIN table1 t2 ON t1.name_id=t2.name_id 
WHERE (t1.term_id = 4 AND t2.term_id=6) OR (t1.term_id = 6 AND t2.term_id=4) 
GROUP BY name_id;

Когда я запускаю этот запрос я получаю

 
+---------+ 
| name_id | 
+---------+ 
|  1 | 
|  3 | 
+---------+ 
+0

, это не сработает. Попробуйте сами. –

+0

Тот же результат, что и мой ответ. @ user499703 что * делать * вы хотите? – Ishtar

+0

Прежде всего, я хочу поблагодарить вас за большую помощь ... Я просто хочу, чтобы я хотел получить все данные от name_id, у которого есть тот же term_id, что и я. .....например, если я хочу имя_ид, у которого есть 4 и 6 term_id, он должен так, чтобы term_id не был при поиске 4 и 6 и 2, который не должен отображать ничего –

Смежные вопросы