带有COUNT的mysql UNION

时间:2013-05-29 10:23:48

标签: mysql

我知道在我的类似问题上有很多帖子,但我似乎无法找到适合我案例的解决方案,如下所示。

我添加了空列,以便列数匹配,我知道我需要在第一个选择中声明所有列。这就是问题所在。我不知道如何在第一个选择中包含COUNT列,该列对应于第二个选择中的COUNT。

感谢您的帮助。

首先选择:

SELECT brands.brand_id, 
       brands.brand, 
       models.model_id, 
       models.model, 
       segments.segment_id, 
       segments.segment, 
       versions.version_id, 
       versions.version, 
       versions.places, 
       versions.gearbox, 
       versions.doors, 
       prices.price 
FROM   versions 
       INNER JOIN models USING (model_id) 
       INNER JOIN segments USING (segment_id) 
       INNER JOIN brands USING (brand_id) 
       INNER JOIN prices USING(version_id) 
WHERE  price BETWEEN 200001 AND 225000 
       AND brands.active = 'Y' 
       AND models.active = 'Y' 
       AND versions.active = 'Y' 

第二次选择:

SELECT Count(*) AS SafetyItems, 
       version_id, 
       NULL     AS COL3, 
       NULL     AS ....,
       NULL     AS COL12 
FROM   versiontrim 
       INNER JOIN trims USING(trim_id) 
       INNER JOIN versions USING(version_id) 
       INNER JOIN prices USING(version_id) 
       INNER JOIN models USING (model_id) 
       INNER JOIN brands USING (brand_id) 
WHERE  trimtype IN( 'sec', 'help' ) 
       AND price BETWEEN 200001 AND 225000 
       AND brands.active = 'Y' 
       AND models.active = 'Y' 
       AND versions.active = 'Y' 
GROUP  BY version_id 

首选的样本结果:

 brand_id   brand   model_id model  segment_id  version_id      price   
   58   Renault    11      Megane       4           44         209900
   58   Renault    14      Scenic       5           54         209900
   58   Renault    11      Megane       4           69         200900
   71   Toyota     29      Yaris        2          214         200900
   71   Toyota     30      Auri         4          216         207900
   52   Nissan     58      Pick-up     14          282         209000
   24   Ford       21      Focus        4          290         209000

我想要的第二个选择的示例结果已附加到上面(在价格列之后):

SafetyItems     version_id  
   9               44
   7               54
   9               69
  10              214
   6              216
   1              282
  10              290

2 个答案:

答案 0 :(得分:0)

我想您还希望在第一个NULL语句中添加SELECT列,该列与第二个COUNT语句中的SELECT列相对应。

只需在第一个NULL中添加SELECT列,就像在第二个SELECT语句中一样,这应该没问题。并且不要忘记列的ALIAS,因为UNION使用第一个SELECT的列名。

SELECT 
NULL AS SafetyItems,
brands.brand_id,
brands.brand,
models.model_id,
models.model,
segments.segment_id,
segments.segment,
versions.version_id,
versions.version,
versions.places,
versions.gearbox,
versions.doors,
prices.price
FROM versions
INNER JOIN models
USING (model_id)
INNER JOIN segments
USING (segment_id)
INNER JOIN brands
USING (brand_id)
INNER JOIN prices
USING(version_id)
WHERE price BETWEEN 200001 AND 225000
AND brands.active='Y'
AND models.active='Y'
AND versions.active='Y'

但是,您需要在第二个NULL中添加另一个SELECT列,以匹配第一个SELECT中的列数。希望这会对你有所帮助。

答案 1 :(得分:0)

我意识到我用错误的方法来解决这个问题。最初我认为我不能选择2作为选择1的COUNT的一部分。事实证明它是可能的,我设法在一些挣扎之后完成它。

感谢您的投入。请参阅以下解决方案:

SELECT brands.brand_id, 
   brands.brand, 
   models.model_id, 
   models.model, 
   segments.segment_id, 
   segments.segment, 
   versions.version_id, 
   versions.version, 
   versions.places, 
   versions.gearbox, 
   versions.doors, 
   prices.price,
   COUNT(trimtype)
FROM   versions 
   INNER JOIN models USING (model_id) 
   INNER JOIN segments USING (segment_id) 
   INNER JOIN brands USING (brand_id) 
   INNER JOIN prices USING(version_id)
   INNER JOIN versiontrim USING(version_id)
   INNER JOIN trims USING(trim_id)
WHERE  price BETWEEN 200001 AND 210000 
   AND trimtype IN('sec', 'help')
   AND brands.active = 'Y' 
   AND models.active = 'Y' 
   AND versions.active = 'Y'
GROUP BY version_id