2013-05-29 80 views
0

我知道在我的类似问题中有很多帖子,但我似乎无法找到适用于我的案例的解决方案,如下所示。mysql UNION与COUNT

我添加了空列,以便列数匹配,并且我知道我需要在第一个选择中指定所有列。这就是问题所在。我不知道如何在第一个选择中包含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 
+0

能不能请你把一些样本数据http://sqlfiddle.com –

+0

嗨德瓦尔,我看着sqlfiddle.com,但我不知道如何将场景添加为以上它。我会看看我能做些什么。 – BernardA

+0

看看http://sqlfiddle.com/#!2/d0dc7/16/0把你的SQL语句 –

回答

0

我猜你也想提出一个NULL列在你的第一个SELECT声明将在第二SELECT声明对应的COUNT列。

只需在您的第一个SELECT中插入一个NULL列,就像在您的第二个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' 

但是,你需要在第二SELECT再添NULL列匹配列数第一SELECT。希望这会帮助你。

+0

谢谢凯尔,但那不行。以上将选择2被添加下面选择1而不是作为列被添加到选择1,这是所需的结果。为了清晰起见,我添加了每个选择的样本。 – BernardA

0

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

感谢您的意见。请参考下面的解决方案:

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