Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql:在同一个表上查询三次_Mysql - Fatal编程技术网

mysql:在同一个表上查询三次

mysql:在同一个表上查询三次,mysql,Mysql,我目前正在写一个查询。 从用户、帖子和帖子中的附加信息表中检索信息(帖子视图信息) 在上面的查询中,我们对同一个表进行三次查询,以获得post'A'、'B'、'C'的数量 为了解决这个问题,我对查询做了如下更改 SELECT u.email, u.user_nm, p.pid, p.post_ttl, p.date, p.ref_level, p.ref_origin, psi.reportCount, psi.reco

我目前正在写一个查询。 从用户、帖子和帖子中的附加信息表中检索信息(帖子视图信息)

在上面的查询中,我们对同一个表进行三次查询,以获得post'A'、'B'、'C'的数量

为了解决这个问题,我对查询做了如下更改

SELECT 
    u.email,
    u.user_nm,
    p.pid,
    p.post_ttl, 
    p.date,
    p.ref_level,
    p.ref_origin,
    psi.reportCount,
    psi.recommendCount,
    psi.oppositeCount,
    p.ref_step,
    date(p.date) = date(now()) AS is_today,
    (SELECT category_path FROM post_category WHERE category_id =     p.category_id) as category_full_path
FROM 
    user AS u,
    (
        SELECT *
        FROM post as p
        WHERE 
            p.is_enable = 1
        ORDER BY 
            p.ref_origin DESC,
            p.ref_step ASC
        LIMIT 0, 15
    ) as p left join
    (
        SELECT 
                pid, 
                COUNT(if(status = 'A', 1, null)) AS reportCount,
                COUNT(if(status = 'B', 1, null)) AS recommendCount,
                COUNT(if(status = 'C', 1, null)) AS oppositeCount
        FROM post_status_info 
        group by pid
    ) AS psi
on 
    psi.pid = p.pid
WHERE 
    p.uid = u.uid
ORDER BY 
    ref_origin DESC,
    ref_step ASC
我认为最好是查询同一个表三次。 哪种代码在性能方面更好


谢谢。

我认为第二种选择在性能方面更有成效。因为这里要执行的查询数量较少

您也可以使用CASE来完成

SELECT 
u.email,
u.user_nm,
p.pid,
p.post_ttl, 
p.date,
p.ref_level,
p.ref_origin,
p.ref_step,
date(p.date) = date(now()) AS is_today,
(SELECT category_path FROM post_category WHERE category_id = p.category_id) as category_full_path,
(SUM(CASE WHEN sub_i.status = 'A' THEN 1 ELSE 0 END)) AS recommendCount,
(SUM(CASE WHEN sub_i.status = 'B' THEN 1 ELSE 0 END)) AS oppositeCount,
(SUM(CASE WHEN sub_i.status = 'C' THEN 1 ELSE 0 END)) AS reportCount
FROM 
(
    SELECT *
    FROM post as p
    WHERE 
        p.is_enable = 1
    ORDER BY 
        p.ref_origin DESC,
        p.ref_step ASC
) as p,
INNER JOIN user AS u ON u.uid = p.uid
INNER JOIN post_status_info as sub_i ON p.pid = sub_i.pid
GROUP BY p.pid
ORDER BY 
ref_origin DESC,
ref_step ASC
SELECT 
u.email,
u.user_nm,
p.pid,
p.post_ttl, 
p.date,
p.ref_level,
p.ref_origin,
p.ref_step,
date(p.date) = date(now()) AS is_today,
(SELECT category_path FROM post_category WHERE category_id = p.category_id) as category_full_path,
(SUM(CASE WHEN sub_i.status = 'A' THEN 1 ELSE 0 END)) AS recommendCount,
(SUM(CASE WHEN sub_i.status = 'B' THEN 1 ELSE 0 END)) AS oppositeCount,
(SUM(CASE WHEN sub_i.status = 'C' THEN 1 ELSE 0 END)) AS reportCount
FROM 
(
    SELECT *
    FROM post as p
    WHERE 
        p.is_enable = 1
    ORDER BY 
        p.ref_origin DESC,
        p.ref_step ASC
) as p,
INNER JOIN user AS u ON u.uid = p.uid
INNER JOIN post_status_info as sub_i ON p.pid = sub_i.pid
GROUP BY p.pid
ORDER BY 
ref_origin DESC,
ref_step ASC