2014-01-29 188 views
0

我有以下2个查询:MySQL的 - 结合单结果查询和多结果查询到一个

此表可以为每个用户多行(很多照片),我只是想返回的照片数量/计数:

SELECT COUNT(*) FROM photos WHERE photo_description_profanity=1 AND photo_visible=1 AND photo_verified=1 AND userid='1000000002'; 

这桌只有每个用户一个:

SELECT a.userid,a.profile_username,a.profile_gender,a.photo_name,a.photo_verified,b.profile_headline, 
     YEAR(DATE_SUB(NOW(), INTERVAL TO_DAYS(a.profile_birthdate) DAY)) AS age,d.city,c.english AS country 
FROM login AS a 
JOIN `profiles` AS b ON a.userid=b.userid 
JOIN geoCountry AS c ON a.profile_country=c.countryCode 
JOIN geoWorld AS d ON a.profile_geo_location=d.pid 
WHERE a.userid IN ('1000000002','1000000003','1000000004'); 

是否有可能这两个查询组合?

这是在我的能力极限,因此任何意见将是巨大的:) THX

+0

请显示您想要的结果。 –

回答

1
SELECT 
    a.userid, 
    a.profile_username, 
    a.profile_gender, 
    a.photo_name, 
    a.photo_verified, 
    b.profile_headline, 
    YEAR(DATE_SUB(NOW(), 
    INTERVAL TO_DAYS(a.profile_birthdate) DAY)) AS age, 
    d.city,c.english AS country, 
    (SELECT COUNT(*) FROM photos WHERE photo_description_profanity=1 AND photo_visible=1 AND photo_verified=1 AND userid= a.userid) AS result_count 
FROM login AS a 
JOIN `profiles` AS b ON a.userid=b.userid 
JOIN geoCountry AS c ON a.profile_country=c.countryCode 
JOIN geoWorld AS d ON a.profile_geo_location=d.pid 
WHERE a.userid IN ('1000000002','1000000003','1000000004'); 
+0

Hey thx so much ... works great ... did not know我可以添加一个选择/查询到像这样的选择...会记住...赞赏:) – Adam

1

这是可能的。这需要两个步骤:

  • 适应COUNT(*)转换成滤波SUM()
  • 堵塞源表到查询

SELECT a.userid,a.profile_username,a.profile_gender,a.photo_name,a.photo_verified,b.profile_headline, 
     YEAR(DATE_SUB(NOW(), INTERVAL TO_DAYS(a.profile_birthdate) DAY)) AS age,d.city,c.english AS country 

//Here we insert the count column 
,IFNULL(SUM(IF(photo_description_profanity=1 AND photo_visible=1 AND photo_verified=1,1,0)),0) AS photocount 

FROM login AS a 
JOIN `profiles` AS b ON a.userid=b.userid 
JOIN geoCountry AS c ON a.profile_country=c.countryCode 
JOIN geoWorld AS d ON a.profile_geo_location=d.pid 

//Here we insert the source table 
LEFT JOIN photos ON photos.userid=a.userid 

WHERE a.userid IN ('1000000002','1000000003','1000000004') 

//Group by users 
GROUP BY a.userid 
+0

这将在MySQL中返回一行。 –

+0

@GordonLinoff谢谢! GROUP BY部分在复制粘贴模式下转义了我的鼠标。 –

1

如果你想这是一个额外的列,然后穿过它加入到结果:

select const.cnt, . . . 
from (SELECT COUNT(*) as cnt 
     FROM photos 
     WHERE photo_description_profanity=1 AND photo_visible=1 AND 
      photo_verified=1 AND userid='1000000002' 
    ) const cross join 
    login AS a 
    JOIN `profiles` AS b ON a.userid=b.userid 
    JOIN geoCountry AS c ON a.profile_country=c.countryCode 
    JOIN geoWorld AS d ON a.profile_geo_location=d.pid 
//Here we insert the source table 
    LEFT JOIN photos ON photos.userid=a.userid 
WHERE a.userid IN ('1000000002','1000000003','1000000004'); 

使用cross join代替嵌套选择查询的优点是性能。 MySQL将为返回集中的每一行执行嵌套选择。在from条款中,它只会被执行一次。