【问题标题】:MySQL SELECT or SUBSELECT with PHPMySQL SELECT 或 SUBSELECT 与 PHP
【发布时间】:2014-10-02 11:52:40
【问题描述】:

我对一个我不记得如何管理的查询有一点问题。 这是我在 phpmyadmin 上的数据库结构:

表用户

hid(PK)

表请求

id (PK), hid, word, time

表格点击

id, rid (FK)

问题是我需要在给定的hid 和两个日期之间获取每个单词的请求数和点击数,我不记得该怎么做。

我尝试选择所有单词,然后在 while 循环中进行查询以选择请求和点击次数,但它总是超过 30 秒超时。

这就是我所做的,显然没有结果:

$q1="SELECT kwd,id FROM requests 
WHERE hid='$hid' 
AND time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:00:00'
LIMIT $limit,50";
$qr1=mysql_query($q1) or die (mysql_error());
while(($r=mysql_fetch_assoc($qr1))!=null)
{
    $k=$r['kwd'];
    $q2="SELECT * FROM requests 
    WHERE hid='$hid' 
    AND time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:00:00' 
    AND kwd='$k'
    LIMIT $limit,50";
    $qr2=mysql_query($q2) or die (mysql_error())
}

【问题讨论】:

    标签: php mysql sql select


    【解决方案1】:

    您可以使用INNER JOINCOUNTGROUP BY 的组合

    $q1="SELECT r.kwd, COUNT(c.id) as NumberOfClicks FROM click c
    INNER JOIN requests r ON r.id = c.rid
    WHERE r.hid='$hid' 
    AND r.time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:00:00'
    GROUP BY r.kwd
    LIMIT $limit,50";
    
    $qr1=mysql_query($q1) or die (mysql_error());
    
    while(($r=mysql_fetch_assoc($qr1))!=null)
    {
        $k=$r['kwd'];
        $c=$r['NumberOfClicks'];
    }
    

    在上面的代码中,$k 是单词,$c 是相关单词的点击次数。

    更新

    如果您还想获取每个单词的请求数,请使用RIGHT JOIN,因为可能存在没有任何相关点击的请求。

    $q1="SELECT r.kwd, 
        COUNT(c.id) AS NumberOfClicks, 
        COUNT(r.kwd) AS NumberOfRequests
    FROM click c
    RIGHT JOIN requests r ON r.id = c.rid
    WHERE r.hid='$hid' 
    AND r.time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:00:00'
    GROUP BY r.kwd
    LIMIT $limit,50";
    
    $qr1=mysql_query($q1) or die (mysql_error());
    
    while(($r=mysql_fetch_assoc($qr1))!=null)
    {
        $k=$r['kwd'];
        $c=$r['NumberOfClicks'];
        $requests=$r['NumberOfRequests'];
    }
    

    $k 是单词,$c 是点击次数,$requests 是相关单词的请求数。

    【讨论】:

    • 真的,太感谢了,这个方法我不记得了,可能时间太久没写查询了:)
    • 如果我还想显示与该词相关的请求数怎么办?
    • 对不起,我说的是每个词的请求数和点击数,我不够清楚:)
    • 非常感谢,你救了我 ;)
    • 对不起,我想我需要另一个帮助,很抱歉打扰你,但是,你能解释一下如何做到这一点:在与首先报告的相同的数据库表上,对于每个请求,我应该得到请求与其相关点击之间的平均时间...我已经尝试过了,但我不确定它是否正常工作:SELECT TIMESTAMPDIFF(SECOND,r.time,c.time) FROM requests r RIGHT JOIN clicks c ON r.id=c.rid WHERE r.hid='$hid'
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2011-11-16
    相关资源
    最近更新 更多