【问题标题】:combine join and union from same table结合来自同一张表的连接和联合
【发布时间】:2018-04-07 22:11:06
【问题描述】:

这是一个名为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

因此,基于 page_name 和源语言,我需要获取此条目和另一个具有目标语言的条目,其中别名与第一个结果相同

我试过了,但没用(只得到第一个条目)

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 查询

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用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.

    【讨论】:

    • 这似乎在我的需要附近,但得到所有条目(如果有其他语言具有相同的page_alias )我只需要es lang 和en lang .... 见sqlfiddle.com/#!9/c82d84/1
    • 您可以随时在where 子句中添加额外的过滤器,请参阅更新后的答案。
    【解决方案2】:

    如果您搜索的列是 ES on EN,为什么需要使用 UNION。请改用 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')
    

    【讨论】:

    • 是的,你有理由在我的小示例表中工作,但我不知道为什么在我的实际项目中返回六行作为结果(3 次 2 行)klin
    • 所以结果是正确的...... id name lang es en 但显示它重复了 3 次相同......并且上面有 klin 答案......按预期工作......我不能发布真实数据...我有 46 种语言的大约 5000 页
    • 所以你有不同ID的重复数据?除了您发布的内容之外,向我展示重复的数据。谢谢。
    • 没有。 Id 是相同的(并且是唯一的主键)...例如,我得到了 id 1 和 3 ... 结果的三倍(不重复的 id-s)
    • 只有一件事。 ... page_name 在其他语言中可以是相同的...我就是为了那个
    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 2021-09-28
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多