Выберите строки из таблицы, где строка в другой таблице с таким же идентификатором имеет конкретное значение в другом столбце - PullRequest
13 голосов
/ 02 февраля 2012

В MySQL:

Если у нас есть две таблицы:

comments
key    |    value
=================
1      |    foo
2      |    bar
3      |    foobar
4      |    barfoo

и

meta
comment_key    |    value
=========================
1              |    1
2              |    1
3              |    2
4              |    1

Я хочу получить комментарии из таблицы comment, которые имеют соответствующий comment_key в таблице meta, которые имеют определенный value (столбец value в таблице meta).

Например, я хотел бы выбрать все строки из таблицы comment, которые имеют value из 1 в таблице meta:

Я бы ожидал этих результатов:

key    |    value
=================
1      |    foo
2      |    bar
4      |    barfoo

И если бы я выбрал все строки из таблицы comment, которые имеют value из 2 в таблице meta:

Я ожидал бы такой результат:

key    |    value
=================
3      |    foobar

Я действительно надеюсь, что кто-то может помочь, спасибо всем заранее!

Думаю, мне нужно объединиться? Любые указатели были бы хорошими, и если это вообще возможно, коротким объяснением, чтобы я мог понять, где я ошибался -> так что я буду знать в следующий раз!

Ответы [ 3 ]

22 голосов
/ 02 февраля 2012

На самом деле я бы не рекомендовал JOIN для этого - точнее, я бы порекомендовал " semijoin ", который является концепцией реляционной алгебры, не выраженной напрямую в SQL.По сути, полусоединение - это соединение, в котором вы хотите получить записи только из одной таблицы, но при условии, что они имеют соответствующие записи в другой таблице.

В нотации SQL эта концепция выражается косвенно с помощью и IN предложение , с подзапросом :

SELECT key, value
  FROM comments
 WHERE key IN
        ( SELECT comment_key
            FROM meta
           WHERE value = 1
        )
;

(MySQL фактически преобразует это обратно во внутреннюю полусоединение - по сути, является своего рода вырожденным-join - но предложение IN является естественным способом выразить его в необработанном SQL.)

0 голосов
/ 25 сентября 2013

Я бы использовал «INNER JOIN» следующим образом:

SELECT comments.key, comments.value FROM comments 
INNER JOIN meta ON comments.key=meta.comment_key WHERE meta.value = 1;

Ура!; -)

0 голосов
/ 02 февраля 2012

Вы ищете простой ванильный экви-джойнт здесь.

SELECT `comment`.`key`   AS `key`,
       `comment`.`value` AS `value`
    FROM `comments` 
        JOIN `meta` 
            ON `comments`.`key` = `meta`.`comment_key` 
    WHERE `meta`.`value` = 1;

Я не совсем уверен, какой совет вы ищете здесь, но вы можете прочитать больше об этой теме (не специфично для MySQL) на странице SQL JOIN Википедии.

Я бы порекомендовал индексировать по comment. key и meta. comment_key, так как оба являются индексами PRIMARY KEY, предполагая, что вы хотите, чтобы в строке comment была только 1 meta строка (PRIMARY КЛЮЧИ УНИКАЛЬНЫ по определению). Если вы хотите разрешить более 1 meta на comment, то добавьте отдельный столбец индекса id к meta и сделайте этот ПЕРВИЧНЫЙ КЛЮЧ с comment_key просто индексом b-дерева.

Я также не уверен, как эта производительность будет сравниваться с перечисленным ниже ответом "полу-соединение", но для меня это более простой и более естественный способ выражения запроса; только с двумя таблицами MySQL не должен быть слишком сложным для оптимизации.

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