1

这里总 n00b,第一次发帖,所以请有建设性!我买了一本书来自学 PHP / MySQL——不幸的是,这本书没有得到普遍的赞扬——所以我的进步有点不稳定。

我有两个要链接的表。我想显示表 1 中保存的所有信息(我们称之为记录),但只显示一次。然后,我想检查 Records 中的每个项目是否与表 2 (UserTable) 中的特定字段匹配,如果匹配,则显示一个勾选的复选框,如果不匹配,则显示一个空复选框。

我迄今为止遇到的问题是仅显示记录中存在匹配项的项目,或者显示记录中每个项目的多个实例,其中存在多个匹配项。我已经用下面的代码解决了这些问题 - 但我一直认为必须有更好的方法来做到这一点,也许只有一个链接?

无论如何,这里有一些代码摘录:

$sql = "SELECT * FROM Records";
$res = mysqli_query($mysqli,$sql);

while ($iteminfo = mysqli_fetch_array($res, MYSQLI_ASSOC)) {
$recordid2 = $iteminfo['record_id'];

我省略了从 Records 中提取相关数据并开始构建表的部分,然后:

$sql2 = "SELECT COUNT(*) AS matches FROM UserTable 
where usertable.item = '$recordid2' and User_ID = '$current_user_id'";

$res2 = mysqli_query($mysqli, $sql2);
$matches = mysqli_fetch_array($res2, MYSQLI_ASSOC);
$matches2 = $matches['matches'];

if ($matches2) {
        $output = "<input type='checkbox' name='test' checked>"; } else {
        $output = "<input type='checkbox' name='test'>";

正如我所说,这可行,但感觉有点笨拙 - 我正在为 Records 中的每个项目运行一个单独的嵌套查询,随着时间的推移,它可能会变得非常慢。有没有一种方法可以针对整个查询运行单个查询,该查询会根据 UserTable 中是否存在匹配项来遍历所有行信息(一次)和 0 或 1?我试过使用 DISTINCT 但无法让它工作。

4

2 回答 2

0

这个怎么样:

SELECT * FROM Records
LEFT JOIN (
    SELECT usertable.item, COUNT(User_ID) AS matches FROM UserTable
    WHERE User_ID = '$current_user_id'
    GROUP BY usertable.item
) as UserTable ON record_id = usertable.item

这将获取所有记录,并且仅获取 UserTable 中给定用户 ID 的匹配行(更改用户 ID 以获取不同用户的详细信息)。

如果 Record 中存在行,但 UserTable 中不存在匹配行,则“matches”将为 NULL。否则它应该是一个大于零的数值。

只需在 PHP 中运行它来处理复选框的内容。(它检查大于零的匹配,只有找到,才会打印出“checked”属性)

<input type="checkbox" name="test" <?=((int)$record['matches'] > 0) ? 'checked="checked"' : ''; ?> />
于 2012-11-07T22:54:21.677 回答
0

做得很好,因为注意到这种方法很笨拙。花一些时间看一下 SQL 语言并更好地理解它。特别是您想学习如何加入。可能是 INNER JOIN。其他类型有 FULL OUTER JOIN、LEFT OUTER JOIN 和 RIGHT OUTER JOIN。

我建议不要在程序代码中加入,而是在 SQL 中加入。然后对数据库进行一次调用,例如

select records.field1, records.field2, matches.field1, matches.field2
from records
   , matches
where records.field = matches.field;

玩这个查询,直到你得到你想要的结果,然后从 PHP 调用它

$sql = <query from above>
$res = mysqli_query($mysqli,$sql);

这样做的一个好处是 SQL 语言是相当可移植的。Access to Oracle 的所有内容都使用类似的语法。无论您使用哪种程序语言(PHP、.NET 等),您都可以使用这些知识

祝你好运。

于 2012-11-07T22:55:05.027 回答