【问题标题】:MySQL: Enumerate and countMySQL:枚举和计数
【发布时间】:2018-12-30 10:14:49
【问题描述】:

我有两张桌子,table1table2

table1 表的示例。

^ invoice ^ valid ^ 
| 10       | yes   | 
| 11       | yes   | 
| 12       | no    | 

table2 表示例

^ invoice ^ detail ^ 
| 10       | A      | 
| 10       | C      | 
| 10       | F      | 
| 11       | A      | 
| 11       | F      |
| 10       | E      | 
| 12       | A      | 

想要从表 2 中选择所有行:

  • 在表 1 中有有效发票

并枚举:

  • 每张发票的详细信息
  • 发票

这里是想要的结果

^ invoice ^ detail ^ ordination ^ ordinationb      ^ 
| 10       | A      |     1       |       1         | 
| 10       | C      |     2       |       1         |  
| 10       | F      |     3       |       1         |  
| 11       | A      |     1       |       2         |  
| 11       | F      |     2       |       2         | 
| 10       | E      |     4       |       1         | 

这句话应该在 phpMyAdmin 4.8.4 中使用有效

【问题讨论】:

  • 在其他人已经回答后,不要大幅改变您的问题。
  • 很抱歉编辑我的问题。以前其他用户误解了这个问题。现在很清楚我想要做什么。我的道歉。也感谢您的帮助。

标签: mysql count enumerate


【解决方案1】:

这是执行此操作的 MySQL 8+ 方式:

SELECT
    t2.Invoice,
    t2.`lines`,
    ROW_NUMBER() OVER (PARTITION BY t2.Invoice ORDER BY t2.`lines`) line_order,
    DENSE_RANK() OVER (ORDER BY t2.Invoice) ordination
FROM table2 t2
WHERE EXISTS (SELECT 1 FROM table1 t1 WHERE t1.Invoice = t2.Invoice AND t1.valid = 'yes');

Demo

如果您使用的 MySQL 版本早于 8,那么您可能不得不求助于使用会话变量。这可能导致丑陋的查询。如果您长期需要这样的查询,那么我建议升级到 MySQL 8+。

编辑:

我突然意识到,我们可以使用相关子查询来模拟您的 ROW_NUMBERDENSE_RANK 要求。这是在 MySQL 5.7 或更早版本中执行此查询的一种方法:

SELECT
    t2.Invoice,
    t2.detail,
    (SELECT COUNT(*) FROM table2 t
    WHERE t.Invoice = t2.Invoice AND t.detail <= t2.detail) ordination,
    t.dr AS ordinationb
FROM table2 t2
INNER JOIN
(
    SELECT DISTINCT
        t2.Invoice,
        (SELECT COUNT(*)
         FROM (SELECT DISTINCT Invoice FROM table2) t
         WHERE t.Invoice <= t2.Invoice) dr
    FROM table2 t2
) t
    ON t.Invoice = t2.Invoice
WHERE EXISTS (SELECT 1 FROM table1 t1 WHERE t1.Invoice = t2.Invoice AND t1.valid = 'yes')
ORDER BY
    t2.Invoice,
    t2.detail;

Demo

【讨论】:

  • @Josías invoice numberInvoice 相同
  • @Tim Biegeleisen 我刚刚编辑了我的示例以澄清它,并将“线条”重新替换为“细节”。你错过了结果“ordinationb” 另一方面,我需要一个有效的 phpMyAdmin 句子。您的 MySQL 8+ 示例不适用于我的情况。
  • 不,我已包含ordination 列。在别人花时间回答问题后,你不应该改变你的问题。我的回答是你应该升级到 MySQL 8。
  • @Tim Biegeleisen 很抱歉编辑。我认为这是最好的。非常感谢您的帮助。您的 MySQL8 解决方案似乎是最好的,但不幸的是,我无法使用它,也无法升级 MySQL。您之前的示例有效,只是错过了最新的专栏。拜托,您能否再次发布此代码,包括错过的列?对不起。我是程序员的新手,也是stackoverflow的新手。感谢您的耐心等待,再次为给您带来的不便深表歉意。
  • @Josías 抱歉耽搁了,我已经给了你一个查询,它应该在你的 MySQL 版本上运行,并且似乎工作正常。希望您能明白为什么您宁愿使用支持分析功能的 MySQL 8+。你可以做你想做的事,但是需要更多的代码。
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多