Php SQL-如果存在于另一个表中

Php SQL-如果存在于另一个表中,php,mysql,sql,Php,Mysql,Sql,共有两个表格:主题和消息 主题表: ----id---- ----title---- 1 Subject 1 2 Subject 2 3 Subject 3 消息表: ----id---- ----subject---- ----message---- 1 1 Message to Subject 1 2 1

共有两个表格:主题消息

主题表:

----id----   ----title----
1            Subject 1
2            Subject 2
3            Subject 3
消息表:

----id----   ----subject----   ----message----
1            1                 Message to Subject 1
2            1                 Message to Subject 1
3            2                 Message to Subject 2
如何获取主题
mysql\u num\u行
,哪个主题在消息中有任何消息?结果必须是2,因为主题1在
消息中有消息
,主题2在
消息中有消息
,但主题3在
消息中没有任何消息

比如:


mysql\u num\u行(mysql\u查询(“从主题中选择*。

您通常会在
中使用
,或
存在
用于此目的:

select count(*)
from subjects s
where exists (select 1 from messages m where m.subject_id = s.id);
这可以很容易地修改,以获得没有消息的主题

如果在表之间定义了适当的外键关系,则可以只计算消息中的主题:

select count(distinct m.subject_id)
from messages;

MySQL中的聚合非常昂贵。在某些情况下,聚合性能会更好。但是,假设您对
消息(subject_id)有一个索引,那么exists
在大多数情况下性能可能会更好。

为此,您通常会在
中使用
exists

select count(*)
from subjects s
where exists (select 1 from messages m where m.subject_id = s.id);
这可以很容易地修改,以获得没有消息的主题

如果在表之间定义了适当的外键关系,则可以只计算消息中的主题:

select count(distinct m.subject_id)
from messages;

MySQL中的聚合非常昂贵。在某些情况下,聚合的性能会更好。但是,假设您对
消息(subject\u id)有一个索引,那么exists
在大多数情况下可能会更好。

试试这个:我想我们可以简单地使用
内部连接来实现聚合

SELECT COUNT(mes.subject) total_msg
FROM subjects sub
INNER JOIN messages mes on mes.subject_id = sub.id

试试这个:我想我们可以简单地使用
内部连接

SELECT COUNT(mes.subject) total_msg
FROM subjects sub
INNER JOIN messages mes on mes.subject_id = sub.id
试试这个

$result = $mysqli->query("SELECT messages.id, messages.message, 
        subjects.title,subjects.id as subjectID
        FROM messages
        INNER JOIN subjects
        ON messages.subject=subjects.id");
    $row_cnt = $result->num_rows;
    echo $row_cnt;
试试这个

$result = $mysqli->query("SELECT messages.id, messages.message, 
        subjects.title,subjects.id as subjectID
        FROM messages
        INNER JOIN subjects
        ON messages.subject=subjects.id");
    $row_cnt = $result->num_rows;
    echo $row_cnt;

如果要在
消息
中搜索
标题
,请尝试此操作

说明:
instr(m.message,s.title)
将在
messages
中搜索
title
,并返回起始位置(整数)。如果未找到,您将得到
0
。因此
instr(m.message,s.title)>1
仅对预期匹配为真


然后,
count(s.title)
将为您提供不同的计数。

如果您想在
消息中搜索
title
,请尝试此操作

说明:
instr(m.message,s.title)
将在
messages
中搜索
title
,并返回起始位置(整数)。如果未找到,您将得到
0
。因此
instr(m.message,s.title)>1
仅对预期匹配为真


然后,
count(s.title)
将为您提供不同的计数。

您的查询在哪里?到目前为止您尝试了什么?
选择计数(不同主题)来自消息
Ithink@OtoShavadze我们可以直接从
subjects
中选择吗?停止使用不推荐的
mysql\u*
API。使用
mysqli\u*
PDO
查询在哪里?到目前为止您尝试了什么?
选择计数(不同的主题)来自消息
Ithink@OtoShavadze我们可以直接从
主题中选择吗
?停止使用不推荐的
mysql\u*
API。对我来说,使用
mysqli\u*
PDO
从Oto的消息中选择计数(不同主题)
似乎比
存在
选项更好…为什么
选择计数(不同主题)来自消息
不起作用…出于好奇和学习。哦,谢谢你的回答,这是正确的答案,我需要直接从
主题
!@PrabhatG中选择,因为我需要从
主题
中选择查询,而不是从
消息
中选择查询。
选择计数(不同主题)对于我来说,从消息来看,
from Oto似乎比
exists
选项更好……为什么
会选择count(不同主题)来自消息
不起作用…出于好奇和学习。哦,谢谢你的回答,这是正确的答案,我需要直接从
主题
中选择!@PrabhatG,因为我需要从
主题
中选择查询,而不是从
消息
中选择查询。