MySQL联盟?查询帮助

时间:2011-02-24 06:06:54

标签: mysql sql

我有两张桌子。一个是专辑信息,另一个是库存中这些专辑的实际副本。它们根据各种因素有不同的价格。清单表中的每一行都不直接存储专辑信息,只是“专辑”表中专辑的ID。

我想写的查询将从相册表中获取艺术家姓名,相册名称,图片等,以及库存表中的最高和最低价格。

我知道基本的MySQL,但我遇到了很多麻烦。有些专家请帮帮我吗?非常感谢!

相册表:

  • id(pk)
  • 标题
  • 艺术家
  • 类型

库存表:

  • ID(PK)
  • albumId(对应于相册表中的ID)
  • 条件

我尝试的查询看起来像这样,但是给了我一个错误:

SELECT albums.artist, albums.title, albums.imgurl, albums.id
  FROM albums

UNION 

SELECT max(inventory.price), min(inventory.price)
 WHERE albums.id = inventory.albumId 
 LIMIT 30

SELECT * FROM `albums`

3 个答案:

答案 0 :(得分:4)

(两部分)UNION的两个部分必须具有相同的列数,并且类型必须相同或可处理,就像它们是相同的一样。

你的第二部分甚至没有FROM条款。

最后一行是一个单独的查询,应该用分号与前一个查询分开。

你想要的是,或多或少:

 SELECT a.artist, a.title, a.imgurl, a.id, MAX(i.price), MIN(i.price)
   FROM albums    AS a
   JOIN inventory AS i ON a.id = i.albumId
--WHERE ...conditions on artist or album...
  GROUP BY a.artist, a.title, a.imgurl, a.id

注意使用表别名如何允许select-list适合一行。当然,它并不总是如此,但使用别名可以提供简洁性,并鼓励使用原始表标记所有列,这有助于使数据来自何处(从而提高可读性和清晰度以及其他优良品质)。

答案 1 :(得分:2)

SELECT albums.artist, albums.title, albums.imgurl, albums.id,
       max(inventory.price), min(inventory.price)
 FROM albums JOIN inventory ON albums.id = inventory.albumId 
GROUP BY albums.id

答案 2 :(得分:1)

你不能那样使用UNION。两个查询的结果集必须相同(即相同数量的列和相同类型)才能使UNION起作用:

  

每个SELECT语句的相应位置中列出的选定列应具有相同的数据类型。 (例如,第一个语句选择的第一列应该与其他语句选择的第一列具有相同的类型。)

您必须单独进行查询。