2015-12-02 33 views
1

我有不同的用户角色,买家和卖家。他们的信息存储在哪里取决于他们的角色。因此,买家信息将被存储在买家表中,卖家在卖家表中。用户角色也保存在时事通讯表中。是否可以在同一查询中使用另一个表中的值?

每个表都有一个名为join_id的公共列,这是来自成员表的成员身份标识。

所以,现在我的问题是有可能写沿此线的东西...

$sql = "SELECT newsletter.email, newsletter.role as role, role.first_name 
     FROM newsletter INNER JOIN role ON newsletter.join_id = role.join_id 
     WHERE newsletter.active = 1"; 
+0

花了我一段时间了解你的问题,但我现在看到它。你有一个买家表和一个卖家表。然后你的'通讯'表有一个列'角色',它包含一个字符串,无论是“买方”还是“卖方”,那么你需要根据字符串''买方'或' newsletter.role'字段包含该特定成员。啊。 – Ultimater

+0

请不要编辑我的文章,你做到了,所以有人刚刚学习就不知道你在说什么。现在,初学者很容易跟踪。 – user3154948

+0

我非常不同意,因为你了解自己的情况可能很清楚,但对任何旁观者来说,他们看到的只是一个查询,它不能解释它应该做什么,以及整个问题的错误语法它很难遵循,并且查询甚至不适合1页,因为它全部在1行上。我的编辑帮助了在stackoverflow上使用问题的质量,但如果您想讨论它,请阅读:http://stackoverflow.com/help/how-to-ask我们已经在此建立策略。如果你不想让我编辑你的问题,那还不清楚,那为什么要回答呢? – Ultimater

回答

1

我会写像这样的查询:

SELECT newsletter.email, newsletter.role, 
IF(newsletter.role='buyer' AND buyers.join_id IS NOT NULL,buyers.first_name, 
    IF(newsletter.role='seller' AND sellers.join_id IS NOT NULL,sellers.first_name, 
    'Not Found') 
) AS first_name 
FROM newsletter 
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id 
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id 
WHERE newsletter.active = 1 

的想法是使用LEFT JOIN而不是INNER JOIN,所以我们包含NULL数据,然后我们加入buyers表和sellers表。加入后,我们使用if语句根据用户在时事通讯日志中的角色选择我们想要的内容。

编辑:

如果你不希望看到“未找到”喜欢在上面,你可以跳过其中newsletter.join_id不匹配的买家或卖家的记录条目。但是,那么你不会看到特定日志的通讯。你会通过调整WHERE做到这一点:以上

SELECT newsletter.email, newsletter.role, 
IF(newsletter.role='buyer',buyers.first_name,sellers.first_name) AS first_name 
FROM newsletter 
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id 
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id 
WHERE newsletter.active = 1 AND (
    (newsletter.role='buyer' AND buyers.join_id IS NOT NULL) 
    OR 
    (newsletter.role='seller' AND sellers.join_id IS NOT NULL) 
) 

可能是比较容易的工作,特别是如果你需要从不是买方/卖方表中选择多个列。

编辑2:

有关管理的情况下,你只需要添加OR newsletter.role='admin'的条件,那么它会寻找在卖家表您的信息。或者,你可以硬编码你的名字信息if语句:

SELECT newsletter.email, newsletter.role, (
CASE newsletter.role 
WHEN 'buyer' THEN buyers.first_name 
WHEN 'seller' THEN sellers.first_name 
WHEN 'admin' THEN 'Hard-code your name here' 
ELSE 'unknown' END 
) AS first_name 
FROM newsletter 
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id 
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id 
WHERE newsletter.active = 1 AND (
    (newsletter.role='buyer' AND buyers.join_id IS NOT NULL) 
    OR 
    (newsletter.role='seller' AND sellers.join_id IS NOT NULL) 
    OR newsletter.role='admin' 
) 
+0

应该只有一个未找到的案例...这是我自己的个人登录,因为我的角色是“管理员”。如果有我有更大的问题!大声笑和我的会员资格不记录任何地方,但会员表。所有用户都被记录为买方或卖方,并且通过3步注册过程多次检查.... – user3154948

+0

对于管理角色的情况,如果您想将自己包含在结果中, d将'OR newsletter.role ='admin''添加到WHERE。但是,由于if语句的写法,它会在卖家表中寻找你。所以如果你想为你的角色使用硬编码的值,你也可以调整它。你可以创建一个“管理”表,如果你要有多个管理员帐号,那么还需要'LEFT JOIN',这样你的if语句就会变得更复杂。如果SQL变得太复杂,可以避免JOINS,只从PHP单独查询。 – Ultimater

+0

为此,我是写新闻通讯的人,所以我不关心接收它。至于有多个管理员,这是一个很大的不行!我的控制自然永远不会允许。大声笑我把它作为2个单独的查询,但它所在的新服务器没有启用mysqlnd,并将所有内容都放入swiftmailer可接受的关联数组中,这是一个BIG pia问题。因此,将所有内容组合成一个大查询是唯一合理简单的答案。 – user3154948

相关问题