Mysql 在一个查询中从两个表中选择一条记录,并从另一个表中选择多条记录
到目前为止,我有4个与此问题相关的选项卡;图片、摄影师、模型和图片模型 一张照片只能有一名摄影师,但有多个模型。在图片表中有一个摄影师id列,也可以在摄影师表中找到 我想从pictures表中选择具有特定pictures.picture\u id的所有内容,从pictures\u表中选择所有内容,然后选择picture\u模型中已分配给照片的所有模型。图片_models表如下所示Mysql 在一个查询中从两个表中选择一条记录,并从另一个表中选择多条记录,mysql,sql,Mysql,Sql,到目前为止,我有4个与此问题相关的选项卡;图片、摄影师、模型和图片模型 一张照片只能有一名摄影师,但有多个模型。在图片表中有一个摄影师id列,也可以在摄影师表中找到 我想从pictures表中选择具有特定pictures.picture\u id的所有内容,从pictures\u表中选择所有内容,然后选择picture\u模型中已分配给照片的所有模型。图片_models表如下所示 Table: picture_models `picture_id` int(10) unsigned
Table: picture_models
`picture_id` int(10) unsigned NOT NULL,
`model_id` int(10) unsigned NOT NULL
SELECT p.*,
ph.*,
COUNT(pv.vote) vote_count,
SUM(pv.vote) vote_sum,
(SELECT COUNT(vote) FROM picture_votes WHERE vote > 0 AND picture_id = ?) plus_votes,
(SELECT COUNT(vote) FROM picture_votes WHERE vote < 0 AND picture_id = ?) minus_votes
FROM pictures p
LEFT JOIN picture_votes pv
ON pv.picture_id = p.picture_id
LEFT JOIN photographers ph
ON p.photographer_id = ph.photographer_id
WHERE p.authenticated = 1
AND
p.picture_id = ?
因此,在picture_模型中,每个图片可以有多个记录。回到我的问题。。是否有可能以某种方式选择模型。*以及图片信息和摄影师信息。到目前为止,我的查询如下:
Table: picture_models
`picture_id` int(10) unsigned NOT NULL,
`model_id` int(10) unsigned NOT NULL
SELECT p.*,
ph.*,
COUNT(pv.vote) vote_count,
SUM(pv.vote) vote_sum,
(SELECT COUNT(vote) FROM picture_votes WHERE vote > 0 AND picture_id = ?) plus_votes,
(SELECT COUNT(vote) FROM picture_votes WHERE vote < 0 AND picture_id = ?) minus_votes
FROM pictures p
LEFT JOIN picture_votes pv
ON pv.picture_id = p.picture_id
LEFT JOIN photographers ph
ON p.photographer_id = ph.photographer_id
WHERE p.authenticated = 1
AND
p.picture_id = ?
做我想做的事是否毫无意义/不可能?最好只做另一个查询,专门选择所有模型?您可以这样做;您将获得每个模型的图片/投票数据的副本。这可能比执行两个单独的查询更有效,尤其是在模型数量较少的情况下 您可能需要将ph.*扩展到各个列中,因为如果没有它,内部查询中将有两个id列,这可能是不允许的。此外,许多数据库都希望通过p.*和ph.*创建一个group,并在内部查询中包含所有列。不过,我认为MySQL会让你逍遥法外
Select
p.*,
m.*
From (
Select
p.*,
ph.*,
count(pv.vote) vote_count,
sum(pv.vote) vote_sum,
sum(case when pv.vote > 0 Then 1 else 0 end) plus_votes,
sum(case when pv.vote < 0 then 1 else 0 end) minus_votes
From
pictures p
left join
picture_votes pv
On pv.picture_id = p.picture_id
left join
photographers ph
On p.photographer_id = ph.photographer_id
Where
p.authenticated = 1 And
p.picture_id = ?
) p
left join
picture_models m
On p.model_id = m.model_id
多亏了@Laurence的回答,我才想出了这个
SELECT
p.*,
m.*
FROM (
SELECT
p.*,
ph.photographer_name,
ph.photographer_website,
ph.photographer_instagram,
ph.photographer_facebook,
ph.photographer_twitter,
ph.photographer_googleplus,
pm.model_id,
COUNT(pv.vote) vote_count,
SUM(pv.vote) vote_sum,
SUM(CASE WHEN pv.vote > 0 THEN 1 ELSE 0 END) plus_votes,
SUM(CASE WHEN pv.vote < 0 THEN 1 ELSE 0 END) minus_votes
FROM
pictures p
LEFT JOIN
picture_votes pv
ON pv.picture_id = p.picture_id
LEFT JOIN
picture_models pm
ON pm.picture_id = p.picture_id
LEFT JOIN
photographers ph
ON ph.photographer_id = p.photographer_id
WHERE
p.authenticated = 1
AND
p.picture_id = 1
GROUP BY
pm.model_id
) p
LEFT JOIN
models m
ON p.model_id = m.model_id
谢谢你的回答。这无疑让我走上了正确的方向。看看我的答案,如果它看起来正确的话,顺便说一下,它是有效的。模型的数量通常只有1个,不应该超过10个。我在内部查询中按pm.model\u id进行了分组,对吗?外部查询中连接到picture\u模型比内部查询更好。到那时你就不需要一个小组了。酷!谢谢顺便问一下,这是为什么?