[英]MySQL : Filter selected value based on value from another table
I have a table as following: 我有一张桌子,如下所示:
User tables 用户表
[id] | [name] | [gender] | [phone]
1 | David | M | 12345678
2 | Mary | F | 18345679
3 | Joe | M | 12845670
4 | John | M | 12345671
5 | May | F | 16355672
And another table 还有另一张桌子
Access_Control tables Access_Control表
[company] | [access_allowed]
Company A | gender
Company A | phone
Company A | name
Company B | name
Company C | gender
Company C | phone
Question : A want a view like the following only using SQL 问题 :仅使用SQL即可获得类似以下的视图
[uid]| [name] | [gender] | [phone] | [owned]
1 | David | M | 12345678 | Company A
2 | Mary | F | 18345679 | Company A
3 | Joe | M | 12845670 | Company A
4 | John | M | 12345671 | Company A
5 | May | F | 16355672 | Company A
1 | David | N/A | N/A | Company B
2 | Mary | N/A | N/A | Company B
3 | Joe | N/A | N/A | Company B
4 | John | N/A | N/A | Company B
5 | May | N/A | N/A | Company B
1 | N/A | M | 12345678 | Company C
2 | N/A | F | 18345679 | Company C
3 | N/A | M | 12845670 | Company C
4 | N/A | M | 12345671 | Company C
5 | N/A | F | 16355672 | Company C
Access_Control tables schema can be changed if needed. 如果需要,可以更改Access_Control表架构。
This is easy to do with conjunction to a server side language, but is this possible with just SQL? 结合服务器端语言很容易做到这一点,但是仅使用SQL就能做到吗? Thanks! 谢谢!
After 3 months, I am finally able to answer my own question, the solution is a bit dirty but it does the job and run very fast. 三个月后,我终于可以回答我自己的问题了,该解决方案虽然有点脏,但确实可以完成并且运行非常快。
Step 1: Change the Access_Control to a vertical view 步骤1:将Access_Control更改为垂直视图
CREATE VIEW `access_control_vertical` AS
SELECT
`access_control`.`company` AS `company`,
BIT_OR((CASE
WHEN (`access_control`.`access_allowed` = 'gender') THEN 1
ELSE 0
END)) AS `gender`,
BIT_OR((CASE
WHEN (`access_control`.`access_allowed` = 'name') THEN 1
ELSE 0
END)) AS `name`,
BIT_OR((CASE
WHEN (`access_control`.`access_allowed` = 'phone') THEN 1
ELSE 0
END)) AS `phone`
FROM
`access_control`
GROUP BY `access_control`.`company`
Result 1: 结果1:
company gender name phone
A 1 1 1
B 0 1 0
C 1 0 1
Step 2: Use cases to filter out which company can have which parameter from user 第2步:用例从用户中过滤出哪个公司可以拥有哪个参数
CREATE VIEW `filtered_user` AS
SELECT
`access_control_vertical`.`company` AS `company`,
(CASE
WHEN (`access_control_vertical`.`gender` = 1) THEN `user`.`gender`
ELSE 'N/A'
END) AS `gender`,
(CASE
WHEN (`access_control_vertical`.`gender` = 1) THEN `user`.`name`
ELSE 'N/A'
END) AS `name`,
(CASE
WHEN (`access_control_vertical`.`gender` = 1) THEN `user`.`phone`
ELSE 'N/A'
END) AS `phone`
FROM
(`user`
JOIN `access_control_vertical` ON ((1 = 1)))
Result 2: 结果2:
company, gender, name, phone
'A', 'M', 'David', '12345678'
'A', 'F', 'Mary ', '18345679'
'A', 'M', 'Joe ', '12845670'
'A', 'M', 'John ', '12345671'
'A', 'F', 'May ', '16355672'
'B', 'N/A', 'N/A', 'N/A'
'B', 'N/A', 'N/A', 'N/A'
'B', 'N/A', 'N/A', 'N/A'
'B', 'N/A', 'N/A', 'N/A'
'B', 'N/A', 'N/A', 'N/A'
'C', 'M', 'David', '12345678'
'C', 'F', 'Mary ', '18345679'
'C', 'M', 'Joe ', '12845670'
'C', 'M', 'John ', '12345671'
'C', 'F', 'May ', '16355672'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.