我有一个包含两类用户的数据库,一个用户可以是individual
或organization
,它们是父用户user
的孩子,我这样做的原因是因为那里是一个组织拥有的individual
没有的属性,不像单个表可以定义两个用户的所有属性并且必须有空字段我决定创建一个user
表两种类型的用户之间的共同属性,然后有一个列保持用户类型,所以如果它是1
那么用户是个人,所以我必须查看individual
表中的所有其他属性反之亦然,individual
和organization
表保存user foreign key
以使其在此处标识为我的数据库表的图形表示
如果你想知道为什么我没有制作一个表,我计划在应用程序增长时为用户和组织表添加更多属性,为扩展留出空间,所以这是我的问题,我想得到一个用户的数据,我已经拥有了他们的ID,但是我如何检查userType并指向右表以获取下一组属性,例如,如果名为John的用户的Id为2并且在单个表中,我该怎么办?他们的名字和姓氏?
我对查询的看法是:
Select users.email, users.profilePhoto, users.userSince, CASE WHEN userType = 1 THEN SELECT individual.fname, individual.lname WHERE users.id = 1 AND individual.userFK = 1 END FROM users
但我不熟悉CASE
声明所以我总是会收到错误,任何想要帮助的人都会受到欢迎。
答案 0 :(得分:1)
您正在尝试在SELECT
部分中构建数据集,但SELECT
部分仅用于更改输出,而不是用于更改输入,而不用于构建数据集。
使用WHERE
语句结合使用JOIN
的交叉选择来构建数据集。
可以使用GROUP BY
进行聚合,但您现在不需要这样做。
SELECT
u.*,
i.*,
o.*
FROM users u
LEFT JOIN individual i
ON i.userFK = u.userFK
LEFT JOIN organization o
ON o.userFK = u.userFK
答案 1 :(得分:0)
我最终做了这个
$userFk = $_POST['userFk'];
$stmt = $conn->prepare("SELECT profilePhoto, userType FROM users WHERE id = ?");
$stmt->bind_param("s", $userFk);
if($stmt->execute())
{
$user = $stmt->get_result()->fetch_assoc();
$userType = $user['userType'];
if($userType == 1)
{
$stmt = $conn->prepare("SELECT fname, lname From individual WHERE userFk = ?");
$stmt->bind_param("s", $userFk);
if($stmt->execute())
{
$details = $stmt->get_result()->fetch_assoc();
$user['fname'] = $details['fname'];
$user['lname'] = $details['lname'];
}
}else if($userType == 3)
{
$stmt = $conn->prepare("SELECT name From organization WHERE userFk = ?");
$stmt->bind_param("s", $userFk);
if($stmt->execute())
{
$details = $stmt->get_result()->fetch_assoc();
$user['organizationName'] = $details['name'];
}
}
}