首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL中的条件选择

MySQL中的条件选择
EN

Stack Overflow用户
提问于 2012-02-15 15:30:18
回答 5查看 539关注 0票数 1

我正在做一个mysql查询,它让我头疼!

场景:

我正在建立一个网站,人们可以选择他们感兴趣的行业(NOTIFY_INDUSTRY)。我加入选定的值并存储在数据库字段中。

一个成员选择农业(id = 9)和石油和天然气(id = 13)。我以9-13的身份加入它们并存储在数据库中。用户可以选择几个行业,不限于两个行业。

此外,成员可以选择一个行业(COMPANY_INDUSTRY),它属于假定信息技术也存储在数据库中。

代码语言:javascript
运行
复制
Sample table (members):

ID
EMAIL
COMPANY_NAME
COMPANY_INDUSTRY
NOTIFY_INDUSTRY

问题:

当一个新用户在网站上注册时,邮件(邮件是每天发送的)发送给现有的用户,这些用户将新用户的行业(COMPANY_INDUSTRY)作为他们感兴趣的行业(NOTIFY_INDUSTRY)之一。

我所做的:

代码语言:javascript
运行
复制
$sql="select id, email
      from members
      where notify_industry in (
        select company_industry
        from members
        where datediff($today, date_activated) <= 1)"

这并不能选择合适的成员,我也不知道该怎么做。

编辑-当前输出的精确问题:

不返回任何行,即使它应该返回。

假设新用户的company_industry是9,并且有一个notify_industry: 10-9-20的现有用户;它意味着返回现有成员的电子邮件,因为新成员属于现有成员的兴趣范围;但是我得到了空白

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-23 21:43:02

你应该重新设计表格,就像其他人建议的那样。

但是,如果不这样做,你可以做一次严重的黑客攻击:

代码语言:javascript
运行
复制
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, '-', '|') || ')[[:>:]]');

糟透了。基本上,您将9-13转换为MySQL正则表达式 [[:<:]](9|13)[[:>:]],它与91313-27-61等匹配,但与19-131等不匹配。(这也支持复合COMPANY_INDUSTRY字段。)

票数 8
EN

Stack Overflow用户

发布于 2012-02-15 16:49:03

正如@Shiplu所指出的,这在很大程度上是一个正常化问题。尽管有些人似乎认为,多价值专栏是谋杀,试图纠正。

你的基本问题是:

您有成员,他们对属于一个或多个行业的一个或多个公司/行业感兴趣。您的表结构可能应该从以下几个方面开始:

代码语言:javascript
运行
复制
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

为了让所有成员感兴趣的公司(直接或通过一个行业),您可以运行以下内容:

代码语言:javascript
运行
复制
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
票数 12
EN

Stack Overflow用户

发布于 2012-02-23 21:13:49

使用联接SQL语法,而不是选择样式。您需要将members表加入到它本身。

目前:

代码语言:javascript
运行
复制
select id, email 
from members where notify_industry in 
  (select company_industry 
          from members 
           where datediff($today, date_activated) <= 1
  )

使用这种风格:

代码语言:javascript
运行
复制
select m1.id, m1.email 
from members m1 
inner join members m2 on m1.company_industry = m.notify_industry
where datediff($today, m2.date_activated) <= 1

注意使用m1和m2的别名来帮助理解哪些id和电子邮件被返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9296200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档