【发布时间】:2015-09-29 15:21:58
【问题描述】:
示例场景:
三张表:Employee、Employer、Vertical Market
雇员(雇员):
| id | fname | lname | employerid|
-----------------------------------
| 108 | John | Doe | 12 |
| 221 | Jane | Doe | 12 |
| 286 | Rob | Smith | 43 |
Employer(雇主):
| id | name | vmarketid|
----------------------------
| 12 | Lowes | 1 |
| 15 | Target | 1 |
| 43 | Chase | 2 |
垂直市场(vmarket):
| id | name |
--------------------
| 1 | retail |
| 2 | banking |
| 3 | healthcare |
我正在研究一组与基于 Web 的报告前端一起使用的查询。第一个查询将填充垂直市场的下拉列表,并在位置 0 添加一个“全部”选项:
select 0, 'All'
union
select `id`, `name` from vmarket
第二个菜单是通过一个存储过程填充的,该过程根据第一个菜单中的选择(也在位置 0 处添加“全部”)为市场类型选择所有可能的雇主:
CREATE DEFINER=`reports`@`%` PROCEDURE `sp_MarketEmployerSearch`(
market_id INT
)
BEGIN
SELECT 0, 'All'
UNION
SELECT `id`, `name`
FROM employer
WHERE `vmarketid` = market_id;
END$$
第三个查询是我的问题和目标的来源。我有另一个程序,我想根据两个选择返回员工信息,无论是全部/全部还是零售/Lowes。显然,基于两个明确定义的值进行选择很容易,但是如果用户选择 All/All,我可以对查询/条件执行什么操作以允许所有行返回?
如果有人从菜单中选择 Retail/Lowes,以下是返回结果的明显语法:
CREATE DEFINER=`reports`@`%` PROCEDURE `sp_EmployeeInfo`(
market_id INT
employer_id INT
)
BEGIN
SELECT employee.`lname` AS `Employee Last Name`,
employee.`fname` AS `Employee First Name`,
employer.`name` AS `Employer Name`,
vmarket.`name` AS `Market Name`
FROM employee
LEFT JOIN employer ON employee.`employerid` = employer.`id`
LEFT JOIN vmarket ON employer.`vmarketid` = vmarket.`id`
WHERE vmarket.`id` = market_id AND employer.`id` = employer_id
ORDER BY vmarket.`name`,employer.`name`,employee.`lname`;
END$$
对于为整个垂直市场甚至所有市场/所有雇主动态返回“所有”记录,唯一想到的是 WHERE 子句中的某种 CASE,但我知道这不是解决方案。如果这不是答案,我有什么选择可以返回,比如说,所有在零售业工作的员工,无论商店如何(根据第一个菜单,vmarketid 将为 1,employeeid 将为 0,返回所有雇主,基于第二个菜单)。
感谢任何帮助!
【问题讨论】: