SO I have a couple of tables that I'd like to combine into one list. I have limited knowledge of what I can do with MySQL and already hit the fact that UNION needs to have the same amount of columns...
One table has data like the following:
| batch_no |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 9 |
| 10 |
| 12 |
The other has
| batch_no | subbatch_no |
|---|---|
| 7 | 1 |
| 7 | 2 |
| 7 | 3 |
| 8 | 1 |
| 8 | 2 |
| 11 | 1 |
| 11 | 2 |
I basically want to be able to have a output that displays like this:
| batch_no |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7-1 |
| 7-2 |
| 7-3 |
| 8-1 |
| 8-2 |
| 9 |
| 10 |
| 11-1 |
| 11-2 |
| 12 |
I've had various attempts but the following is the best I came up with but obviously is sorting incorrectly...
SELECT batch_no FROM batch
UNION
SELECT CONCAT(batch_no,'-',subbatch_no) FROM subbatch
ORDER BY batch_no DESC
With this the order is seemingly being done as if it were text because I have put the hyphen in, stumped as to how to do this... Any help or advice would be very appreciated. Thank you.
CodePudding user response:
Do the ordering on the original union, adding an extra subbatch_no column to the batch subquery. Then order these together by two columns in the main query, where you can also concatenate them with the - separator.
SELECT CONCAT_WS('-', batch_no, subbatch_no) AS combined_batch_no
FROM (
SELECT batch_no, NULL AS subbatch_no
FROM batch
UNION
SELECT batch_no, subbatch_no
FROM subbatch
) AS sub1
ORDER by batch_no, subbatch_no
CodePudding user response:
it is actually quite easy sorting apha numrical qith your data
SELECT CAST(batch_no as char) batchno FROM batch UNION SELECT CONCAT(batch_no,'-',subbatch_no) FROM subbatch ORDER BY batchno 0 ASC| batchno | | :------ | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7-1 | | 7-2 | | 7-3 | | 8-1 | | 8-2 | | 9 | | 10 | | 11-1 | | 11-2 | | 12 |
db<>fiddle here
CodePudding user response:
select CONCAT_WS('-',batch_no,subbatch_no) from (
SELECT batch_no,null subbatch_no FROM batch
UNION ALL
SELECT batch_no,subbatch_no FROM subbatch
) A
ORDER BY batch_no,subbatch_no
CodePudding user response:
Try with the following:
WITH cte AS (
SELECT batch_no, NULL as subbatch_no FROM tab1
UNION ALL
SELECT * FROM tab2
)
SELECT CONCAT_WS('-' , batch_no, subbatch_no) AS batch_no
FROM cte
ORDER BY cte.batch_no, cte.subbatch_no
Check the demo here.
