[英]Count the number of rows in MySQL table with criteria depending on other table
我有两个桌子:
content:
id access
1 3
2 5
3 9
viewlevels:
id group
1 [10,12,15]
2 [8,12,11]
3 [9,10,5]
内容中的访问字段与视图级别中的id字段相关。
我根据当前用户组在视图级别中选择行。 因此,例如,如果group = 10,我的查询将选择第1行和第3行。如果group为12,它将选择第1行和第2行,依此类推。我正在使用以下查询:
$query="SELECT id FROM #__viewlevels WHERE rules LIKE '%$group%'";
我的挑战是计算表内容中列ID的行数,其中访问与从表视图级别的上述查询中选择的ID相匹配。
我尝试了以下代码,但返回了错误:undefined variable: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;
首先,您确实应该规范化数据。 考虑为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
您需要“加入”表。
sql命令不能单独查询两个表。
当您“联接” SQL中的2个表时,可以认为它是在空中创建1个虚拟/临时表,然后可以查询2个表。
这是一个很好的介绍http://www.sitepoint.com/understanding-sql-joins-mysql-database/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.