【问题标题】:Getting entries from database where there are more than one entry in a corresponding database with a shared ID (prepared statement)从具有共享 ID 的相应数据库中有多个条目的数据库中获取条目(准备好的语句)
【发布时间】:2013-02-10 18:54:58
【问题描述】:

这会有点复杂。但我会尝试解释我想要做什么。

我在数据库中有如下表:

表格 - 条目

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 个图像条目时,列出表条目中的所有条目。如果它有 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语句或者如何正确绑定到prepared statement中

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

还是什么?这只是一个 SQL 问题吗?还是我需要一个 if 语句并运行一个单独的 SQL 查询。

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

【问题讨论】:

  • 您可以在此条目和图片上使用left join

标签: php mysql if-statement mysqli prepared-statement


【解决方案1】:

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

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

【讨论】:

  • 哦,我今天学到了一些新东西 :) 谢谢。解决了我的问题。必须等待 2 分钟才能选择您的答案。谢谢!
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多