是否可以在同一查询中使用另一个表中的值?

时间:2015-12-02 19:51:57

标签: select mysqli

我有不同的用户角色,买家和卖家。存储信息的地方取决于他们的角色。因此,买方信息将存储在买方表格中,卖方存储在卖方表格中。用户角色也保存在新闻稿表中。

每个表都有一个名为join_id的公共列,它是成员表中的成员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";

1 个答案:

答案 0 :(得分: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语句根据用户在简报日志中的角色选择我们想要的内容。

修改

如果你不想看到" Not Found"如上所述的条目,您可以跳过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:

对于admin的情况,您只需要在条件中添加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'
)