我有不同的用户角色,买家和卖家。存储信息的地方取决于他们的角色。因此,买方信息将存储在买方表格中,卖方存储在卖方表格中。用户角色也保存在新闻稿表中。
每个表都有一个名为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";
答案 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'
)