Sql 艰难地编写我的第一个连接查询

Sql 艰难地编写我的第一个连接查询,sql,Sql,我有三张桌子,我试着在下面摆出来。我被困住了。我没有做过很多查询,以前从未做过连接,我真的很困惑如何做到这一点。我的一个查询示例是简单的英语 从web\u design=“1”所在的技能区域获取所有公文包\u项目\u ID, 然后使用公文包项目id的id值从公文包项目中获取所有行 然后,对于每一行,从标签中获取行,其中portfolio_item_id等于portfolio_item_id,illustrator、photoshop或css中的一个值为1 我设法提出了一个问题 选择投资组合项目

我有三张桌子,我试着在下面摆出来。我被困住了。我没有做过很多查询,以前从未做过连接,我真的很困惑如何做到这一点。我的一个查询示例是简单的英语

从web\u design=“1”所在的技能区域获取所有公文包\u项目\u ID, 然后使用公文包项目id的id值从公文包项目中获取所有行 然后,对于每一行,从标签中获取行,其中portfolio_item_id等于portfolio_item_id,illustrator、photoshop或css中的一个值为1

我设法提出了一个问题


选择投资组合项目标识

来自技能领域

其中网页设计=1


选择*

来自投资组合项目

其中p.id=s.portfolio\u item\u id


选择*

来自标签t

其中s.portfolio\u item\u id=t.portfolio\u item\u id


所以我认为这是正确的,我现在必须把它结合起来


组合项目

身份证

项目名称

描述

技能领域

投资组合\项目\ id

网页设计

品牌

印刷品

标签

投资组合\项目\ id

插图画家

photoshop

css

试试这个:

SELECT sa.portfolio_item_id, pi.*, subtags.*
FROM skill_area sa
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id
INNER JOIN (SELECT CASE WHEN illustrator = '1' THEN 'illustrator' 
                        WHEN photoshop = '1' THEN 'photoshop' 
                        ELSE 'css' END as tag, portfolio_item_id 
            FROM tags) subtags ON sa.portfolio_item_id = subtags.portfolio_item_id
WHERE sa.web_design = '1'
您评论说您希望有一个替代方案,您只需要从标记中获取所有列

SELECT sa.portfolio_item_id, pi.*, tags.*
FROM skill_area sa
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id
INNER JOIN tags ON sa.portfolio_item_id = tags.portfolio_item_id
WHERE sa.web_design = '1'
试试这个:

SELECT sa.portfolio_item_id, pi.*, subtags.*
FROM skill_area sa
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id
INNER JOIN (SELECT CASE WHEN illustrator = '1' THEN 'illustrator' 
                        WHEN photoshop = '1' THEN 'photoshop' 
                        ELSE 'css' END as tag, portfolio_item_id 
            FROM tags) subtags ON sa.portfolio_item_id = subtags.portfolio_item_id
WHERE sa.web_design = '1'
您评论说您希望有一个替代方案,您只需要从标记中获取所有列

SELECT sa.portfolio_item_id, pi.*, tags.*
FROM skill_area sa
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id
INNER JOIN tags ON sa.portfolio_item_id = tags.portfolio_item_id
WHERE sa.web_design = '1'

下面是这样一个查询的样子。我试图逐字翻译你的英语变体,以帮助你理解,并包括注释来描述STPE

select s.portfolio_item_id, p.*, t.*
from Skill_Area s                                 -- get all portfolio_item_ids from skill_area
inner join Portfolio_Items p on                   -- then get all the rows from portfolio_items
    p.portfolio_item_ids = s.portfolio_item_ids   -- with the id values of portfolio_item_ids
inner join Tags t on                              -- then for each row, get the row from tags
    t.portfolio_item_id = p.portfolio_item_id     -- where portfolio_item_id is equal to portfolio_item_id
    and t.portfolio_item_id = 1                   -- and the value of it is 1
where s.web_design = "1"                          -- where web_design = "1"

下面是这样一个查询的样子。我试图逐字翻译你的英语变体,以帮助你理解,并包括注释来描述STPE

select s.portfolio_item_id, p.*, t.*
from Skill_Area s                                 -- get all portfolio_item_ids from skill_area
inner join Portfolio_Items p on                   -- then get all the rows from portfolio_items
    p.portfolio_item_ids = s.portfolio_item_ids   -- with the id values of portfolio_item_ids
inner join Tags t on                              -- then for each row, get the row from tags
    t.portfolio_item_id = p.portfolio_item_id     -- where portfolio_item_id is equal to portfolio_item_id
    and t.portfolio_item_id = 1                   -- and the value of it is 1
where s.web_design = "1"                          -- where web_design = "1"

分步骤进行分解,就像你在“简明英语”中所说的那样:

  • 获得网页设计技能

    select * from skill_area where web_design = '1'
    
  • 加入公文包项目

    select * 
     from skill_area s, portfolio_items p 
     where web_design = '1' 
       and p.id = s.portfolio_item_id
    
  • 使用标记联接,选择value=1的行并仅返回标记表中的列)


  • 分步骤进行分解,就像你在“简明英语”中所说的那样:

  • 获得网页设计技能

    select * from skill_area where web_design = '1'
    
  • 加入公文包项目

    select * 
     from skill_area s, portfolio_items p 
     where web_design = '1' 
       and p.id = s.portfolio_item_id
    
  • 使用标记联接,选择value=1的行并仅返回标记表中的列)



  • 他不想从你这里得到一切!我还应该提到,我需要能够在tags值为1的情况下获得列名,相应的结果是否包含列名的详细信息?
    tags
    表是否有id字段?不,我认为它不需要id字段,只需要公文包项目的id。他不想从Sthank you那里得到一切!我还应该提到,我需要能够在tags值为1的情况下获取列名,相应的结果是否包含列名的详细信息?
    tags
    表是否有id字段?不,我认为它不需要,只需要公文包的id。\u items谢谢!我还应该提到,我需要能够在标记值为1的情况下获取列名,相应的结果是否会包含列名的详细信息?我明白了,所以您不希望这三个列(值为0,0,1)具有列名。。。请稍等。不,我希望列名中的value=“1”作为resultYeah的一部分,但这并不容易。你可以用一个案例来解决这个问题,当结构(一种或另一种,我设计它的方式不是“最好的”)来解决这个问题。@Nicola我不确定你的实际数据是什么样子的,所以当对子标签使用
    左连接时,也许你会得到正确的结果。或者,如果标签中的条目中没有带“1”的列,则需要在标签的
    之后添加“where illustrator='1'或photoshop='1'或css='1'”,
    谢谢!我还应该提到,我需要能够在标记值为1的情况下获取列名,相应的结果是否会包含列名的详细信息?我明白了,所以您不希望这三个列(值为0,0,1)具有列名。。。请稍等。不,我希望列名中的value=“1”作为resultYeah的一部分,但这并不容易。你可以用一个案例来解决这个问题,当结构(一种或另一种,我设计它的方式不是“最好的”)来解决这个问题。@Nicola我不确定你的实际数据是什么样子的,所以当对子标签使用
    左连接时,也许你会得到正确的结果。或者,如果标签中的条目中没有带“1”的列,则需要在标签的
    之后添加“where illustrator='1'或photoshop='1'或css='1'”,
    我正在阅读这些内容,并尝试遵循逐步的说明,这样做会更简单!我想这些字母是表格的缩写吧?在数字3中,它开始选择t,那么t在任何地方都没有定义,那么它如何知道它是什么呢?是的,字母是缩写(它们被称为别名)。再近一点看…'“t”是“tags”的别名。哦,我明白了,这样就可以在查询中进一步定义它了?我认为它是按照陈述的顺序进行的。@VinodKurup啊哦,我差不多讲到了最后,现在的问题是我说value=1让人们感到困惑,我的意思是:检索所有的列名,这些列名的字段包含该公文包的1\u item\u idHmmm。。。使用简单的DB查询来获取列“名称”(相对于值)并不是那么容易。要么使用@AngeloNeuschitzer的答案,要么在得到查询结果后再执行这一步。我只是在通读这篇文章,试图遵循一步一步的说明,这样做会更简单!我想这些字母是表格的缩写吧?在数字3中,它启动sele