0

我有两张桌子:

content:
id    access
1     3
2     5
3     9

viewlevels:
id   group
1    [10,12,15]
2    [8,12,11]
3    [9,10,5]

content 中的 access 字段与 viewlevels 中的 id 字段相关。

我根据当前用户组选择视图级别中的行。例如,如果组 = 10,我的查询将选择第 1 行和第 3 行。如果组是 12,它将选择第 1 行和第 2 行,等等。我使用以下查询:

$query="SELECT id FROM #__viewlevels WHERE rules LIKE '%$group%'";

我的挑战是计算表内容中列 id 的行数,其中访问权限与上述表视图级别查询中选择的 id 匹配。

我尝试了以下代码,但它返回错误:未定义变量:nartigos

$query="SELECT count(id) FROM #__content WHERE access IN (SELECT id FROM #__viewlevels WHERE rules LIKE '%$group%')";

if ($stmt = mysqli_prepare($link, $query)) {

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* store result */
    mysqli_stmt_store_result($stmt);

    $nartigos=mysqli_stmt_num_rows($stmt);

    /* close statement */
    mysqli_stmt_close($stmt);
};

echo "Nº de artigos " .$nartigos;
4

2 回答 2

1

首先,你真的应该标准化你的数据。考虑为 viewLevels 使用多对多连接表,而不是将所有组放在一行中。这可能看起来像这样:

access_id  group_id
1          10
1          12
1          15
2          8
2          11
2          12
3          5
3          9
3          10

这将使您的查询变得简单

SELECT c.id AS `content_id`, COUNT(v.access_id) AS `content_count`
FROM content AS c INNER JOIN viewLevels AS v
  ON c.access_id = v.access_id
WHERE v.group_id = ?
GROUP BY c.id

?是您要查询的组 ID。

如果没有规范化(我再次强烈建议您这样做),您仍然会使用连接,但它看起来像这样:

SELECT c.id AS `content_id`, COUNT(v.access_id) AS `content_count`
FROM content AS c INNER JOIN viewLevels AS v
  ON c.access_id = v.access_id
WHERE v.group LIKE '%?%'
GROUP BY c.id
于 2013-08-23T22:52:17.350 回答
-3

你需要“加入”你的桌子。

sql命令不能分别查询两个表。

当您在 sql 中“加入”2 个表时,可以将其视为在空中创建一个虚拟/临时表,然后您可以查询 2 个表。

这是一个很好的介绍http://www.sitepoint.com/understanding-sql-joins-mysql-database/

于 2013-08-23T22:54:50.330 回答