объединить объединение и объединение из одной таблицы

avatar
MTK
7 апреля 2018 в 22:11
38
2
1

Вот пример таблицы с именем pages

.
id  page_name    page_alias   lang
1   pagina1        pagina1     es
2   pagina2        pagina2     es
3   page1          pagina1     en
4   page2          pagina2     en

Я знаю page_name = pagina1, источник lang = es и пункт назначения lang = en<25212370>999723>

Итак, исходя из имени страницы и исходного языка, мне нужно получить эту запись и еще одну запись с целевым языком, где псевдоним совпадает с первым результатом

Я пробовал это, но не работает (получить только первую запись)

SELECT A.* FROM pages AS A
JOIN pages AS B
ON
B.page_alias = A.page_alias AND B.lang = 'en'   
WHERE A.page_name = 'pagina1' AND A.lang = 'es'

Ожидаемый результат запроса (две строки):

1   pagina1        pagina1     es
3   page1          pagina1     en

Кажется, нужен UNION, но я не знаю, как использовать page_alias из первого запроса в запросе UNION

Источник

Ответы (2)

avatar
klin
7 апреля 2018 в 22:23
3

Используйте оператор IN:

select *
from pages
where page_alias in (
    select page_alias
    from pages
    where page_name = 'pagina1' and lang = 'es'
    )
and lang in ('en', 'es')

SqlFiddle.

MTK
7 апреля 2018 в 22:31
0

Кажется, это близко к моим потребностям, но получить все записи (если есть другие языки с тем же page_alias ). Мне нужен только язык es и язык en .... см. sqlfiddle.com/# !9/c82d84/1

klin
7 апреля 2018 в 22:34
0

Вы всегда можете добавить дополнительный фильтр в предложение where, см. обновленный ответ.

avatar
jose_bacoy
7 апреля 2018 в 22:35
1

Зачем использовать UNION, если искомый столбец либо ES, либо EN. Вместо этого используйте предложение IN.

вот демонстрация: http://sqlfiddle.com/#!9/15afd1/8

SELECT DISTINCT A.*
FROM pages AS A
JOIN pages AS B
ON B.page_alias = A.page_alias 
 AND B.page_name = 'pagina1'
WHERE A.lang in ('es', 'en')
MTK
7 апреля 2018 в 22:49
0

Да, у вас есть причина, по которой работа основана на моей крошечной таблице примеров, но я не знаю, почему в моем реальном проекте в результате возвращаются шесть строк (3 раза по 2 строки) klin

MTK
7 апреля 2018 в 22:52
0

Таким образом, результат правильный ... id name lang es en, но покажите, что он повторяется 3 раза одно и то же ... и с ответом klin выше ... работайте, как предполагалось ... я не могу публиковать реальные данные ... я около 5000 страниц на 46 языках

jose_bacoy
7 апреля 2018 в 22:56
0

Итак, у вас есть дублированные данные с другим идентификатором? покажите мне дублированные данные помимо того, что вы опубликовали. Благодарю.

MTK
7 апреля 2018 в 22:58
0

Нет. Идентификатор тот же (и уникальный первичный ключ)... например, я получил идентификатор 1 и 3... в результате три раза (не повторяющиеся идентификаторы)

MTK
7 апреля 2018 в 23:01
0

Только одна вещь. ... page_name может быть таким же на другом языке ... Я для этого

jose_bacoy
7 апреля 2018 в 23:03
0

возможно, ошибка в sqlfiddle. Я поставил отдельные, чтобы исправить это.

jose_bacoy
7 апреля 2018 в 23:06
0

предложение where будет фильтровать его. В случае, если другой язык, отличный от ES, имеет такое же имя page_name='pahina1'

MTK
7 апреля 2018 в 23:07
0

да. С DISTINCT это работает. Но мне нравится быть честной ... Я получаю от вас только плюсы (ответ Клин был первым) Спасибо за вашу помощь