我有这个问题:
SELECT *, m.id AS mooringid
FROM mooring m JOIN customer c ON m.assignedTo = c.id
WHERE m.Number = :var OR (CONCAT(c.TitleName,' ',c.Surname) LIKE CONCAT('%', :var, '%')) OR m.MooringArea = :var
ORDER BY c.Surname limit 0,250
这应该是从另一个表中获取分配给客户的元素,我看到我能做到这一点的唯一方法是通过“元素”输入客户详细信息,返回元素但我想限制金额客户返回但允许无限元素,但是,这限制了元素而不是客户,并且在我的情况下不起作用。
这可能吗?我错过了什么吗?
答案 0 :(得分:0)
解决此问题的一种方法是对客户执行子查询并提取所需的数字。类似的东西:
from (select c.*
from customers c
limit 100
) c
但是,在你的情况下,你有很多二次过滤(连接条件和where)。相反,在每行添加一个客户计数器,并使用它来选择一定数量的客户:
select t.*
from (SELECT *, m.id AS mooringid,
@rn := if(@cid = c.id, @rn + 1, 1) as rn,
@cid = c.id
FROM mooring m JOIN
customer c
ON m.assignedTo = c.id cross join
(select @rn := 0, @cid := -1) const
WHERE m.Number = :var OR
(CONCAT(c.TitleName,' ',c.Surname) LIKE CONCAT('%', :var, '%')) OR
m.MooringArea = :var
ORDER BY c.Surname
) t
order by c.SurName
where rn <= 10;