I want to grab some specific rows of two tables before and after a certain time, this is my code:
mysql_query = """ select tb1x.id from table1 as tb1x join table2 as tb2x ON tb2x.id = tb1x.cid where tb1x.created > CURDATE() UNION ALL (select tb1y.id from table1 as tb1y join table2 as tb2y ON tb2y.id = tb1y.cid where tb1y.created < CURDATE() ) where tb2x.id=tb2y.id ORDER BY tb1y.created DESC;"""
It gives an error and indicates that UNION is not used properly.
and I guess the problem could be here: AND tb2x.id=tb2y.id
Could you please help where is the problem or if it’s an smart way to compare two different sections of a table?
Advertisement
Answer
UNION doesn’t permits any comparison between columns, so where tb2x.id=tb2y.id after a UNION is an error
https://en.wikipedia.org/wiki/Set_operations_(SQL)#UNION_operator
To compare two different sections of a table you have to JOIN itself:
SELECT *
FROM (
       SELECT
         tb1x.id,
         tb1x.created
       FROM table1 AS tb1x
         JOIN table2 AS tb2x
           ON tb2x.id = tb1x.cid
       WHERE tb1x.created > CURDATE()
     ) AS tb3x
  JOIN
  (
    SELECT
      tb1y.id,
      tb1y.created
    FROM table1 AS tb1y
      JOIN table2 AS tb2y
        ON tb2y.id = tb1y.cid
    WHERE tb1y.created < CURDATE()
  ) AS tb3y
    ON tb3x.id = tb3y.id
ORDER BY tb3y.created DESC;
Another thing is collect all rows in one table before and after a certain time. You need to use UNION of two sub-query table, each of which is a filter of the input table:
SELECT *
FROM (
  (
    SELECT
      tb1x.id,
      tb1x.created
    FROM table1 AS tb1x
      JOIN table2 AS tb2x
        ON tb2x.id = tb1x.cid
    WHERE tb1x.created > CURDATE()
  )
  UNION ALL
  (
    SELECT
      tb1y.id,
      tb1y.created
    FROM table1 AS tb1y
      JOIN table2 AS tb2y
        ON tb2y.id = tb1y.cid
    WHERE tb1y.created < CURDATE()
  )
)
ORDER BY created DESC;