Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
Php MYSQL:如何从2个连接的表中获得最后一次下载_Php_Mysql_Database_Join_Left Join - Fatal编程技术网

Php MYSQL:如何从2个连接的表中获得最后一次下载

Php MYSQL:如何从2个连接的表中获得最后一次下载,php,mysql,database,join,left-join,Php,Mysql,Database,Join,Left Join,这是我的第一个问题,所以请友好一点:) 我有这个: mysql> select cat_id, cat_name from phpbb_dm_eds_cat; +--------+----------+ | cat_id | cat_name | +--------+----------+ | 9 | catx | | 10 | cat2 | | 11 | test | +--------+----------+ mysql> se

这是我的第一个问题,所以请友好一点:)

我有这个:

mysql> select cat_id, cat_name from phpbb_dm_eds_cat;
+--------+----------+
| cat_id | cat_name |
+--------+----------+
|      9 | catx     |
|     10 | cat2     |
|     11 | test     |
+--------+----------+

mysql> select subcat_id, subcat_name from phpbb_dm_eds_subcat;
+-----------+--------------+
| subcat_id | subcat_name  |
+-----------+--------------+
|        39 | aaa          |
|        40 | xxx111       |
|        41 | TESTXX       |
|        42 | xxa          |
+-----------+--------------+
以下是下载表:

mysql> select download_id, download_title, download_cat_id from phpbb_dm_eds;
+-------------+----------------+-----------------+
| download_id | download_title | download_cat_id |
+-------------+----------------+-----------------+
|           3 | s              |               9 |
|           5 | raver          |              41 |
|           6 | hans           |              10 |
|           7 | readme         |              42 |
+-------------+----------------+-----------------+
现在查询:

mysql>
SELECT bc.cat_name, bc.cat_id,
    COUNT(bd.download_id) AS number_downloads,
    MAX(bd.last_changed_time) AS last_download
FROM phpbb_dm_eds_cat bc
LEFT JOIN phpbb_dm_eds bd ON bd.download_cat_id = bc.cat_id
GROUP BY bc.cat_id   ;

+----------+--------+------------------+---------------+
| cat_name | cat_id | number_downloads | last_download |
+----------+--------+------------------+---------------+
| catx     |      9 |                1 |    1427072549 |
| cat2     |     10 |                1 |    1427125950 |
| test     |     11 |                0 |          NULL |
+----------+--------+------------------+---------------+
“测试”类别有一个子类别,子类别表中有一个下载,类别“catx”和“cat2”也有下载,最后一次下载显示正确,但我希望子类别“测试”中的最后一次下载也显示出来


如何编写查询?

您不清楚自己想要什么,但可能是:

SELECT bc.cat_name, bc.cat_id,
    COUNT(bd.download_id) AS number_downloads,
    MAX(bd.last_changed_time) AS last_download
FROM (
        select cat_id, cat_name from phpbb_dm_eds_cat
    union
        select subcat_id as cat_id, subcat_name as cat_name
        from phpbb_dm_eds_subcat
    ) as bc
LEFT JOIN phpbb_dm_eds bd ON bd.download_cat_id = bc.cat_id
GROUP BY bc.cat_id   ;
(您的选择使用的是MySQL扩展,因为cat_id既不在GROUP BY中,也不在聚合中。)

从您的注释“测试”类别有一个子类别”,我建议cat表“phpbb_dm_eds_cat”和子cat表之间应该存在关系 “phpbb_dm_eds_subcat”

像这样:
表名
phpbb_dm_eds_cat

(类别id、类别名称)

表名
phpbb_dm_eds_subcat


(cat_id引用表phpbb_dm_eds_cat(cat_id),subcat_id,subcat_name)

很遗憾,您的查询不起作用,它会给我所有子类别,如下所示:

+----------+--------+------------------+---------------+
| cat_name | cat_id | number_downloads | last_download |
+----------+--------+------------------+---------------+
| catx     |      9 |                1 |    1427072549 |
| cat2     |     10 |                1 |    1427125950 |
| test     |     11 |                0 |          NULL |
| aaa      |     39 |                0 |          NULL |
| xxx111   |     40 |                0 |          NULL |
| TESTXX   |     41 |                1 |    1427123713 |
| xxa      |     42 |                1 |    1427136789 |
+----------+--------+------------------+---------------+
7 rows in set (0,00 sec)
我不想显示子类别,我只想从子类别下载最后一次,这应该是正确的输出:

+----------+--------+------------------+---------------+
| cat_name | cat_id | number_downloads | last_download |
+----------+--------+------------------+---------------+
| catx     |      9 |                1 |    1427072549 |
| cat2     |     10 |                1 |    1427125950 |
| test     |     11 |                1 |    1427213321 |
+----------+--------+------------------+---------------+
3 rows in set (0,00 sec)

你最后的第二段不明白。(我编辑了一点。)请讲清楚。请用多个句子。是否希望最后下载每个子类别表子类别?如果是,那么为什么要提到“测试”?这种设计实际上是不可行的,请给出您的表定义。还要解释一下你的桌子。您说“类别有子类别”,但数据库在哪里保存这些信息?根据我上面的评论采取行动。你还没有回答我所有的评论。2.由于您尚未解释希望查询返回的内容,请完成以下句子:当且仅当名为
cat\u name
的任一类别具有id
cat\u id
时,查询结果中应有一行,下载次数
number\u downloads
和上次下载
last\u download
或名为
cat\u name
的子类别具有id
cat\u id
和?3.阅读。我认为应该有一些左连接或类似的东西来识别子类别在哪个主类别中,只要我只想显示主类别,并且需要从每个主类别1的子类别中获取值。将此“答案”编辑到您的问题中。2.为什么“test”last_downloads不同于所有子类别last_downloads?我将阅读您的“答案”,您应该将其编辑到您的问题中,以了解更多您想要的内容,但请阅读我对您问题的评论:您不清楚,请使用英语清楚地解释您想要的内容。我不希望从每个子表中下载最后一个_,我只想从每个MAINCAT上下载最后一次,如果MAINCAT上有一个subcat,其中有一个下载,我将只从subcat上下载最新的下载,同时只显示一次MAINCAT,例如MAINCAT[test]subcat[aaa]]download=file.pdf]subcat[bbb][download=readme.txt]如果readme.txt是readme.txt或file.pdf中的最新文件,则只应显示maincat=test download=readme.txt。。。希望你说清楚你不清楚。如何确定“主猫是否有子猫”??读我的评论,照他们说的做。不要希望,行动。子类别中有一个名为“parent_id”的字段desc phpbb_dm_eds_subcat;+----------------+------+------+------+------+-----------+-----------+-----------+-----------+-----------++-----------+-----------++-----------+-----------+++-----------字段| Type | Null | Key | Default | Extra |+---------+---------+---------+---------+---------+----+----子字段id | int(9)| NO | PRI | Null | auto u increment | parent | id | int(9)| NO | | Null |子字段名称| varchar|否| |空| |+-------------+--------------+------+-----+---------+----------------+