[英]how to use limit with UNION in mysql
所以,我有这个问题。
我必须从内部联接中的不同表中获取多条记录并进入 UNION 或 UNION ALL 并使用限制进行一次分页,以下代码用于获取所有记录和计数。 这是我的克星:
(SELECT pp.id as id, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join inn_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE (pp.type = 1 or pp.type = 2)
$where )
UNION
(SELECT pp.id as id, pp.*, i.model as name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join rent_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE pp.type = 3
$where)
UNION
(SELECT pp.id as id, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join fish_pay_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE pp.type = 4
$where )
UNION
(SELECT pp.id as id, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join stores_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE pp.type = 5
$where)
UNION
(SELECT pp.id as id, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join transfer_oficial i ON i.photo_id = pp.property_id
inner join plans p ON pp.plans_id = p.id
WHERE pp.type = 6
$where)
GROUP BY pp.id
ORDER BY pp.id
我从13.2.9.3 UNION Clause得到这个例子并尝试了脚本
当我尝试运行代码时出现错误
You have a syntax error in your SQL next to 'GROUP BY id ORDER BY id LIMIT 0.25' on line 1
对不起我糟糕的英语,这不是我的母语
我解决了 kskskskks,只需将 pp id 列添加为 id_p,然后按它排序
(SELECT pp.id as id_p, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join inn_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE (pp.type = 1 or pp.type = 2)
$where )
UNION
(SELECT pp.id as id_p, pp.*, i.model as name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join rent_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE pp.type = 3
$where)
UNION
(SELECT pp.id as id_p, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join fish_pay_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE pp.type = 4
$where )
UNION
(SELECT pp.id as id_p, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join stores_oficial i ON i.photo_id = pp.property_id
left join plans p ON pp.plans_id = p.id
WHERE pp.type = 5
$where)
UNION
(SELECT pp.id as id_p, pp.*, i.name, p.name as plans_name, u.username,u.email,u.phone, DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) as end_date FROM property_purchase pp
inner join users u ON pp.users_id $username
inner join transfer_oficial i ON i.photo_id = pp.property_id
inner join plans p ON pp.plans_id = p.id
WHERE pp.type = 6
$where)
ORDER BY id_p $pagination
LIMIT 0.25
引起了我的怀疑,因为您提供的查询中没有表示此子句。
这并不重要,因为这看起来像一个XY 问题——我认为没有必要使用任何 UNION 子句或 GROUP BY。 您通过多次扫描整个表迫使您的服务器做太多工作,更不用说开发人员不得不阅读如此冗长和重复的查询的眼睛疲劳了。
我不知道$where
里面有什么,但我的水晶球告诉我这不是安全的查询做法。 如果传入任何变量,我想使用准备好的语句。
如果您需要根据pp.type
对列值进行个性化控制,那么您可以在 SELECT 中使用CASE
表达式。
我认为您的查询可以归结为如下内容:
SELECT pp.*,
i.name,
p.name AS plans_name,
u.username,
u.email,
u.phone,
DATE_ADD(pp.init_date, INTERVAL pp.avaliable_days DAY) AS end_date
FROM property_purchase pp
JOIN users u ON pp.users_id = u.id
JOIN inn_oficial i ON pp.property_id = i.photo_id
LEFT JOIN plans p ON pp.plans_id = p.id
WHERE pp.user_id = ?
AND pp.type BETWEEN 1 AND 6
$where
ORDER BY pp.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.