2015-04-30 2 views
0

Одна таблица А, выглядит следующим образом:нужен эффективный запрос для выбора из двух таблиц

table A: 
========== 
ID  NAME 
1  Ted 
2  John 
3  Sandy 
4  Robert 
5  Helen 

table B: 
========= 
CONTRIBUTION   CONTRIBUTOR_ID 
100     1 
200     3 
150     3 
270     2 
30     1 

Предполагая, что таблица B очень большой и настольный А маленький, я хотел бы псевдо итерацию по этому вопросу. - принять первый идентификатор из таблицы А - поиск первого вхождения в таблице B, если найдено добавить в результате - если не продолжать к следующему ID в таблице А. - повторять до конца таблицы А

Я бы как список всех идентификаторов из таблицы А, которые существуют в таблице B Таким образом, результат здесь будет:

1 
2 
3 

конечно, таблицы проиндексированы надлежащим образом.

любая идея, как написать это эффективно в MySQL? Благодаря

+0

Определения "первого вхождения". – Michas

+0

, но не присоединился бы просто к сумме до всей длины таблицы B? величина n – Ted

+0

только в любом случае, не первый или последний. Мне просто нужны идентификаторы всех тех, кто когда-либо «внес вклад» – Ted

ответ

3
select distinct ID from tableA inner join tableB 
on table.ID=tableB.CONTRIBUTOR_ID 
2

Попробуйте это:

select tA.ID 
from tableA tA inner join tableB tB on tA.ID = tB.CONTRIBUTOR_ID 
group by tA.ID 
+0

. Я не вижу необходимости использовать группу здесь. –

+1

@SuchitKumar: - Использование 'group by' очень похоже на использование' distinct' при условии правильной индексации в столбце. А так как таблица B огромна, поэтому я предполагаю, что OP будет (* must *) создавать индекс в столбце. –

5

или просто

select distinct contributor_id 
from table B 
+4

Предполагая, что все участники TableB существуют в TableA. –

+2

Правда. но я ожидал бы приличного дизайна, в котором есть foreign_key для A.id – avk

+1

@avk: - В этом случае использование JOIN было бы хорошей идеей. Также попробуйте создать индекс на вашем столе, который поможет быстро найти! –

0

запросе

SELECT * from A,B where A.ID = B.CONTRIBUTOR_ID

бы выбрать ll строк с существующим идентификатором в обеих таблицах. Он оставил бы все строки в которых никогда не способствовали (не существует в B)

EDIT:

только получить идентификаторы тех, кто когда-либо вклад, попробуйте:

SELECT ID FROM A WHERE EXISTS (SELECT CONTRIBUTOR_ID FROM B where ID = CONTRIBUTOR_ID) 
+2

не использовать *, если вам не нужно все. –

+0

Он также возвратит одну строку для каждого события в таблице B (не один раз для каждого вкладчика) и не будет особенно эффективен. –

+0

@MarkBannister yepp, вздымается до нет. строк. остальное зависит от индексов. –

0

Если таблица B может содержать вкладчиков, которые не существуют в таблице А, то я предлагаю попробовать:

select tA.ID 
from tableA tA 
inner join (select distinct contributor_id from tableB) tB 
     on tA.ID = tB.CONTRIBUTOR_ID 

(если у вас есть индекс по поставщику _ID на TableB)

0

Может быть сделан с помощью подзапросов

Select distinct ID from A where ID in(select CONTRIBUTOR_ID from B) 
Смежные вопросы