从表B中选择匹配表A

时间:2015-10-15 12:55:22

标签: mysql sql

我有这个架构:

items               | taxonomy             |    subjects 
                    |                      |
ID    headline      | item_id  subject_id  |    subject_id    subject
-------------------------------------------------------------------------
1     information   | 1        1           |    1             cities
2     here we are   | 2        1           |    2             towns
3     more things   | 3        2           |    3             water 
4     doo dah       | 3        4           |    4             telephones
                    | 4        1           |
                    | 4        3           |

我想从“items”中选择一行并使用它,包括“subjectonomy”表连接的“subject”中的所有行。例如,获取item.ID=3会产生类似的结果:

items.ID         = 3
items.headline   = "more things"
subjects.subject = "towns"
subjects.subject = "telephones"

我已经开始使用此查询

 SELECT 
    i.ID,
    i.headline,
    s.subject_name
  FROM items i
  JOIN taxonomy t 
    on i.ID=t.item_id 
  JOIN subjects s 
    on t.subject_id=s.subject_id  
  WHERE i.ID = 3

但即使有多个与该item_id相关联的值,这只会从subject_name返回单个值。

修改 我实际上在查询上有一个LIMIT 1,导致(如@Gordon Linoff所说)只返回一行,即使结果集中有多行对应多个主题。他的解决方案仍然很好,因为我只想返回一行。

2 个答案:

答案 0 :(得分:3)

您的查询返回多行的主题。如果您想要行上的主题,那么您需要某种形式的连接:

 SELECT i.ID, i.headline, GROUP_CONCAT(s.subject_name) as subjects
 FROM items i JOIN
      taxonomy t 
      ON i.ID = t.item_id JOIN
      subjects s 
      ON t.subject_id = s.subject_id  
 WHERE i.ID = 3
 GROUP BY i.ID, i.headline;

对于一个项目,GROUP BY是可选的,但如果您修改查询以处理多个项目,这是一个很好的形式。

答案 1 :(得分:0)

我建议您使用“union all”子句(或“union”,如果您不需要重复项)。

 (SELECT 
    "taxonomy" As Name,
    i.headline As Value
  FROM items i
  JOIN taxonomy t 
    on i.ID=t.item_id 
  WHERE i.ID = 3)

Union All

 (SELECT 
    "subject" As Name,
    s.subject_name As Value
  FROM items i
  JOIN subjects s 
    on t.subject_id=s.subject_id  
  WHERE i.ID = 3)

您可以在每个选择中添加第二个字段以指示所选项目的类型(“标题”,“主题”等)。