phpmyadmin 选择用户尚未订阅的扩展

bqjvbblv  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(139)

我一直在寻找一个解决方案,我的问题堆栈溢出,但我似乎不能找到一个解决方案,适合,或我能够实现。
我有三张表:“扩展”、“订阅”、“帐户”。
扩展表:
| 扩展标识|扩展名|
| - -|- -|
| 一个|第一分机|
| 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来回显列表。
我已经在这个问题上花了很长时间,用谷歌和逻辑作为我的朋友,但我似乎不能使它工作。要么没有显示,或者我得到正确的结果在非常特殊的情况下,即如果用户只订阅了一个扩展。
感谢所有可能的帮助。

mbzjlibv

mbzjlibv1#

您正在混合使用'JOIN的新旧样式,当您使用较新的样式时,几乎不会出错。
除了在代码中使用查询之前测试它们之外,如果您对语法不熟悉,

SELECT 
    ex.*, su.*,ac.*
FROM 
    codium.extensions ex
JOIN 
    codium.subscriptions su ON ex.extension_id = su.extension  
JOIN 
    codium.accounts ac ON ac.id = su.user 
WHERE         
    ac.id = :id

为了你的问题。
这将显示来自不在订户中且连接到所选用户的分机的所有行

SELECT * FROM
Extensions e1
WHERE
   extension_id NOT IN (SELECT extension FROM Subscriptions  WHERE user = :id)

要标记已存在的扩展名,可以使用LEFT JOIN

SELECT ei.*, IF(su.subscription_id IS NOT NULL, 1,0) as marked FROM
Extensions e1 LEFT JOIN 
   (SELECT subscription_id ,extension FROM Subscriptions  WHERE user = :id) su ON ex.extension_id = su.extension

相关问题