【问题标题】:MYSQL: Howto get last download from 2 joined tablesMYSQL:如何从 2 个连接的表中获取最后一次下载
【发布时间】:2015-05-26 21:15:58
【问题描述】:

这是我的第一个问题,所以请善待:)

我有这个:

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 |
+----------+--------+------------------+---------------+

“test”类别有一个子类别,在 subcat 表中有下载,“catx”和“cat2”类别也有下载,最后一次下载显示正确,但我希望 subcat 'test 中的 last_download '也要显示

如何编写查询?

【问题讨论】:

  • 您的倒数第二段难以理解。 (我已经编辑了一点。)请更清楚。请使用多个句子。您想要 every 子目录表子类别的 last_download 吗?如果是,那为什么要提到“测试”?
  • 这种设计几乎行不通
  • 给出你的表定义。还要解释你的桌子。您说“类别有一个子类别”,但数据库在哪里保存该信息?根据我上面的评论采取行动。
  • 1.你还没有解决我所有的cmets。 2. 由于您还没有解释您希望查询返回什么,请完成以下句子:当且仅当名为cat_name 的任何一个类别的id 为cat_id,下载次数@ 时,查询结果中才会出现一行987654327@ 和上次下载 last_download 或名为 cat_name 的子类别具有 id cat_id 和...? 3.阅读this

标签: php mysql database join left-join


【解决方案1】:

你不清楚你想要什么,但它可能是:

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   ;

(您的 SELECT 正在使用 MySQL 扩展,因为 cat_id 既不在 GROUP BY 也不在聚合中。)

【讨论】:

  • 我会阅读您的“答案”,您应该将其编辑到您的问题中,以了解更多关于您想要什么的信息,但请阅读我对您问题的评论:您不清楚,请使用英语清楚地解释你想要什么。
  • 我不想要每个子表的 last_download,我只想要每个 MAINCAT 的 last_download,如果 maincat 有一个包含下载的 subcat,我只会从 subcat 下载最新的下载,而只有一次maincat 显示,例如 maincat[test] subcat[aaa]]download=file.pdf] subcat[bbb][download=readme.txt] 如果 readme.txt 是它应该只显示 maincat=test download=readme.txt来自 readme.txt 或 file.pdf 的最新文件 ...希望清楚
  • 你不清楚。如何确定“主猫有子猫”?阅读我的 cmets 并按照他们所说的去做。不要希望,行动吧。
  • subcats 中有一个名为“parent_id”的字段 desc phpbb_dm_eds_subcat; +-------------+-------------+------+-----+------ --+----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-------------+-------------+------+-----+------ --+----------------+ | subcat_id |整数(9) |否 |优先级 |空 |自动增量 | | parent_id |整数(9) |否 | |空 | | |子目录名 | varchar(255) |否 | |空 | | +-------------+-------------+------+-----+------ --+----------------+
【解决方案2】:

从你的笔记“'test'类别有一个子类别”,我建议cat表“phpbb_dm_eds_cat”和sub_cat表之间应该有关系 “phpbb_dm_eds_subcat”。

像这样:
表名
phpbb_dm_eds_cat

(cat_id,cat_name)

表名
phpbb_dm_eds_subcat

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

【讨论】:

    【解决方案3】:

    很遗憾你的查询不起作用,它给了我所有的子猫,像这样:

    +----------+--------+------------------+---------------+
    | 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)
    

    【讨论】:

    • 我认为应该有一些左连接或类似的东西来识别子猫在哪个主猫中,只要我希望只显示主猫并且需要从每个主猫中的子猫获取值
    • 1.将此“答案”编辑到您的问题中。 2. 为什么'test' last_downloads 与所有子类last_downloads 不同?
    猜你喜欢
    • 2022-12-17
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多