1

这会有点复杂。但我会尝试解释我正在尝试做的事情。

我在数据库中有一个表,如下所示:

表 - 条目

ID | User | Address | Workflow | Audit Date |
1  | Tim  | 123     | 10 p/w   |  22/2/2013 |
2  | Bob  | 222     | 20 p/w   |  22/2/2013 |

现在在相应的表格中,我有图片:

表 - 图片

ID | JobNo | User | ImagePath | ImageName |
52 | 1     | Tim  | /1.jpg    | /2.jpg    |
53 | 1     | Tim  | /3.jpg    | /4.jpg    |

现在 Pictures.Jobno 对应 Entries.ID

好吧,我所追求的是,​​当相关的 jobNo 有超过 2 个图像条目时,列出表 Entries 中的所有条目。如果它有 1 个或更少,我想忽略列表。

所以目前我可以通过php调用这样的条目:

    function getAllEntries() {
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    if (!($query = $mysqli->prepare("SELECT * FROM Entries
                                    ORDER BY Date DESC"))) {
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
    }
    if (!$query->execute()) {
    echo "Execute failed: (" . $query->errno . ") " . $query->error;
}
    $query->bind_result($ID, $User, $Address, $Workflow, $Audit);
    while ($query->fetch()) {
        //Echo each entry here
    }
    $query->close();
    $mysqli->close();
}

我的问题是,我该如何合并我想做的事情?我想说:

选择所有条目,其中表 Pictures 中有 2 个或更多图像对应于 Entries 表中的作业编号/id 比较。

我确信这是可行的。但我想不出 sql 语句或如何将它正确绑定在准备好的语句中

SELECT * FROM Entries, Pictures, Where Pictures.Jobno = ID.Entries AND(图片中的行数)>= 2。

或者其他的东西?这只是一个 SQL 问题吗?或者我是否需要一个 if 语句并运行一个单独的 SQL 查询。

恐怕我是用 php 和 sql 自学的 - 所以我不太知道如何自己解决这个问题。

4

1 回答 1

2

处理这个问题的方法通常是加入一个子查询,该查询检索每个图片的数量JobNo并过滤子句>= 2中的图片HAVING

SELECT 
  entries.*, 
  numpics
FROM entries 
LEFT JOIN (
  /* Subquery joined returns aggregate COUNT() in pictures per JobNo */
  SELECT JobNo, COUNT(*) AS numpics FROM pictures GROUP BY JobNo
) pcounts ON entries.ID = pcounts.JobNo
HAVING numpics >= 2

http://sqlfiddle.com/#!2/347f4/8

由于 MySQL 对 的宽松处理GROUP BY,您可能只需要一个 , 就可以逃脱LEFT JOIN,而pictures无需子查询:

/* MySQL Only */
SELECT entries.*
FROM
  entries 
  LEFT JOIN pictures ON entries.ID = Pictures.JobNo
GROUP BY entries.ID
HAVING COUNT(pictures.JobNo) >= 2
于 2013-02-10T19:04:09.147 回答