在mysql

时间:2019-04-12 13:12:21

标签: mysql sql

我正在用php实现项目,其中用户有一些书,例如书号为1号书-系列151至175,这意味着1号书有25页,每页都有唯一的书号。从151,152 ... 175。

enter image description here

用户使用一页特定书来生成某种类型的凭证。有时可以为单个页面生成两个凭证,即151A和151B。

enter image description here

所以我需要一个SQL查询,该查询返回从1到175的虚拟行,并与凭证表左连接

就是这样

enter image description here

1 个答案:

答案 0 :(得分:1)

如果您的mysql版本支持CTE,则可以尝试使用CTE RECURSIVE表创建一个Outer JOIN表的结果集。

或者您可以将WHILE与临时表配合使用来为序列号创建结果集。

查询#1

WITH RECURSIVE CTE AS (
    SELECT start_series,end_series
    FROM books
    UNION ALL
    SELECT start_series + 1,end_series
    FROM CTE
    WHERE start_series < end_series
)
SELECT c.start_series,
       coalesce(CONCAT(c.start_series,v.post_fix),v.voucher_page_no) voucher_no
FROM CTE c LEFT JOIN voucher v 
on c.start_series = v.voucher_page_no
ORDER BY c.start_series;

| start_series | voucher_no |
| ------------ | ---------- |
| 151          | 151A       |
| 151          | 151B       |
| 152          | 152        |
| 153          | 153        |
| 154          |            |
| 155          | 155        |
| 156          |            |
| 157          |            |
| 158          |            |
| 159          |            |
| 160          |            |
| 161          |            |
| 162          |            |
| 163          |            |
| 164          |            |
| 165          |            |
| 166          |            |
| 167          |            |
| 168          |            |
| 169          |            |
| 170          |            |
| 171          |            |
| 172          |            |
| 173          |            |
| 174          |            |
| 175          |            |

View on DB Fiddle