【问题标题】:mySQL stored procedure return all rows multiple constraintsmySQL 存储过程返回所有行多个约束
【发布时间】: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,返回所有雇主,基于第二个菜单)。

感谢任何帮助!

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    如果我了解您的目标,此解决方案对我有用:

    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 OR market_id=0) AND (employer.id = employer_id OR employer_id=0)
    ORDER BY vmarket.name,employer.name,employee.lname;
    

    【讨论】:

    • 是的,这行得通!我曾尝试过这样的事情,但我做错了。我输入的是实际值=0,而不是参数=0,例如:WHERE (vmarket.id = market_id OR vmarket.id=0) AND (employer.id = employee_id OR employees.id=0)。非常感谢您为我拼写出来。
    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2014-01-04
    • 2018-08-13
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多