Ogu*_*nwu 1 mysql sql select conditional
我正在研究一个mysql查询,它让我很头疼!
场景:
我正在建立一个网站,人们可以选择他们感兴趣的行业(NOTIFY_INDUSTRY).我加入选定的值并存储在数据库字段中.
示例:成员选择农业(id = 9)和石油和天然气(id = 13).我以9-13加入它们并存储在数据库中.用户可以选择多个行业,不限于两个行业.
此外,成员可以选择它所属的行业(COMPANY_INDUSTRY),也可以选择存储在数据库中的信息技术.
Sample table (members):
ID
EMAIL
COMPANY_NAME
COMPANY_INDUSTRY
NOTIFY_INDUSTRY
Run Code Online (Sandbox Code Playgroud)
问题:
当新用户在网站上注册时,邮件(邮件每天发送)将发送给拥有新用户行业(COMPANY_INDUSTRY)作为其感兴趣行业之一的现有用户(NOTIFY_INDUSTRY).
我做了什么:
$sql="select id, email
from members
where notify_industry in (
select company_industry
from members
where datediff($today, date_activated) <= 1)"
Run Code Online (Sandbox Code Playgroud)
这不会选择正确的成员,我不知道正确的方法去做
编辑 - 当前输出的确切问题:
不返回任何行,即使它应该.
假设新用户的company_industry是9,并且现有用户有notify_industry:10-9-20; 它旨在返回现有成员的电子邮件,因为新成员属于现有成员感兴趣的类别; 但我得到了空白
Clo*_*use 12
正如@Shiplu指出的那样,这在很大程度上是一个规范化问题.尽管有些人似乎认为,多值列是谋杀以试图纠正.
您的基本问题是:
您的成员对一个或多个公司/行业感兴趣,属于一个或多个行业.你的表结构应该从以下开始:
Industry
===============
id -- autoincrement
name -- varchar
Company
==============
id -- autoincrement
name -- varchar
Company_Industry
===============
companyId -- fk reference to Company.id
industryId -- fk reference to Industry.id
Member
===============
id -- autoincrement
name -- varchar
email -- varchar
Member_Interest_Industry
=========================
memberId -- fk reference to Member.id
industryId -- fk reference to Industry.id
Member_Interest_Company
========================
memberId -- fk reference to Member.id
companyId -- fk reference to Company.id
Run Code Online (Sandbox Code Playgroud)
要让所有公司成员对(直接或通过行业)感兴趣,您可以运行以下内容:
SELECT a.name, a.email, c.name
FROM Member as a
JOIN Member_Interest_Company as b
ON b.memberId = a.id
JOIN Company as c
ON c.id = b.companyId
WHERE a.id = :inputParm
UNION
SELECT a.name, a.email, d.name
FROM Member as a
JOIN Member_Interest_Industry as b
ON b.memberId = a.id
JOIN Company_Industry as c
ON c.industryId = b.industryId
JOIN Company as d
ON d.id = c.companyId
WHERE a.id = :inputParm
Run Code Online (Sandbox Code Playgroud)
您应该像其他人所建议的那样重新设计表格.
但是,除此之外,你可以做到这一点:
SET sql_mode = 'ANSI';
SELECT notify_members.id, notify_members.email
FROM members notify_members
INNER JOIN members new_members
WHERE CURRENT_DATE - new_members.date_activated <= 1
AND
new_members.company_industry RLIKE ('[[:<:]](' || REPLACE(notify_members.notify_industry, '-', '|') || ')[[:>:]]');
Run Code Online (Sandbox Code Playgroud)
呸.基本上,你转9-13成MySQL的正则表达式 [[:<:]](9|13)[[:>:]],它匹配9,13,13-27-61等等,但不匹配19-131等.(这也支持复合COMPANY_INDUSTRY字段.)
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |