Mysql 在一个查询中从两个表中选择一条记录,并从另一个表中选择多条记录

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

到目前为止,我有4个与此问题相关的选项卡;图片、摄影师、模型和图片模型

一张照片只能有一名摄影师,但有多个模型。在图片表中有一个摄影师id列,也可以在摄影师表中找到

我想从pictures表中选择具有特定pictures.picture\u id的所有内容,从pictures\u表中选择所有内容,然后选择picture\u模型中已分配给照片的所有模型。图片_models表如下所示

   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模型比内部查询更好。到那时你就不需要一个小组了。酷!谢谢顺便问一下,这是为什么?