namse / join-monster

A GraphQL to SQL query execution layer for query planning and batch data fetching.
http://join-monster.readthedocs.io/en/latest/
MIT License
0 stars 0 forks source link

Wrap table in `from` and `join` on limit #1

Open namse opened 5 years ago

namse commented 5 years ago

Actually, join monster doesn't support multiple limit. So, if I put limit in order by section, it looks like this.

SELECT
  `board`.`id` AS `id`,
  `posts`.`id` AS `posts__id`,
  `board$`.`id` AS `posts__board$__id`,
  `posts$`.`id` AS `posts__board$__posts$__id`
FROM boards `board`
LEFT JOIN posts `posts` ON `board`.id = `posts`.boardId
LEFT JOIN boards `board$` ON `posts`.boardId = `board$`.id
LEFT JOIN posts `posts$` ON `board$`.id = `posts$`.boardId
WHERE `board`.name = "humor"
ORDER BY `posts`.`id` DESC Limit 5, `posts$`.`id` DESC Limit 5

To achieve multiple limit, the query should be like below

SELECT
  `board`.`id` AS `id`,
  `posts`.`id` AS `posts__id`,
  `board$`.`id` AS `posts__board$__id`,
  `posts$`.`id` AS `posts__board$__posts$__id`
FROM (select * from boards Order by `boards`.`id` DESC limit 5) as `board`
LEFT JOIN ( select * from posts ORDER BY id DESC limit 5) `posts` ON `board`.id = `posts`.boardId
LEFT JOIN boards `board$` ON `posts`.boardId = `board$`.id
LEFT JOIN ( select * from posts ORDER BY id DESC limit 5) as `posts$` ON `board$`.id = `posts$`.boardId;
namse commented 5 years ago

Let's use IN in JOIN's ON statement.

SELECT
  `board`.`id` AS `id`,
  `posts`.`id` AS `posts__id`,
  `board$`.`id` AS `posts__board$__id`,
  `posts$`.`id` AS `posts__board$__posts$__id`
FROM boards as `board`
LEFT JOIN posts `posts` ON `board`.id = `posts`.boardId AND `posts`.id IN (40, 45, 53)
LEFT JOIN boards `board$` ON `posts`.boardId = `board$`.id
LEFT JOIN posts `posts$` ON `board$`.id = `posts$`.boardId AND `posts$`.id IN (41, 42, 53)
WHERE `board`.name = "humor"
ORDER BY `posts`.`id` DESC , `posts$`.`id` DESC;

Because limit doesn't work very well.