我一直在寻找一个解决方案,我的问题堆栈溢出,但我似乎不能找到一个解决方案,适合,或我能够实现。
我有三张表:“扩展”、“订阅”、“帐户”。
扩展表:
| 扩展标识|扩展名|
| - -|- -|
| 一个|第一分机|
| 2个|第二分机|
“预订”表:
| 订阅标识|延伸部分|使用者|
| - -|- -|- -|
| 一个|一个|一个|
| 2个|2个|一个|
账户表:
| 标识符|使用者名称|
| - -|- -|
| 一个|若翰|
| 2个|萨拉|
这里有两个ID分别为1和2的扩展,ID为1的用户在订阅表中订阅了这两个扩展。
通过执行以下操作,我已成功获取登录用户订阅的扩展名列表:
SELECT
*
FROM
codium.extensions
JOIN
codium.subscriptions
JOIN
codium.accounts
WHERE
extensions.extension_id = subscriptions.extension
AND
accounts.id = subscriptions.user
AND
accounts.id = :id
然后在php中用$sql->execute(["id" => $_SESSION["user_id"]]);
定义:id是什么。
但是,我无法显示用户未订阅的订阅列表。如果用户只订阅了第一个扩展,则显示第二个扩展。如果用户根本没有订阅,则显示两个扩展。
如果有必要,在执行查询时,我使用$extensions = $sql->fetchAll();
,然后使用foreach来回显列表。
我已经在这个问题上花了很长时间,用谷歌和逻辑作为我的朋友,但我似乎不能使它工作。要么没有显示,或者我得到正确的结果在非常特殊的情况下,即如果用户只订阅了一个扩展。
感谢所有可能的帮助。
1条答案
按热度按时间mbzjlibv1#
您正在混合使用'JOIN的新旧样式,当您使用较新的样式时,几乎不会出错。
除了在代码中使用查询之前测试它们之外,如果您对语法不熟悉,
为了你的问题。
这将显示来自不在订户中且连接到所选用户的分机的所有行
要标记已存在的扩展名,可以使用LEFT JOIN