media_subscriptions
+----+--------------------------+
| id | target_metadata_item_id |
+----+--------------------------+
| 30 | 19039 |
| 31 | NULL |
| 32 | NULL |
| 33 | NULL |
| 34 | NULL |
| 35 | NULL |
| 36 | NULL |
| 37 | 18976 |
+----+--------------------------+
metadata_items
+-------+-----------------+-----------+
| id | guid | parent_id |
+-------+-----------------+-----------+
| 18976 | id://265 | NULL |
| 18977 | id://265/1 | 18976 |
| 19039 | id://841 | NULL |
| 19040 | id://841/1 | 19039 |
| 19041 | id://841/1/1 | 19040 |
| 19224 | id://841/1/2 | 19040 |
| 19966 | id://265/1/1 | 18977 |
| 19967 | id://290 | NULL |
| 19968 | id://376 | NULL |
+-------+-----------------+-----------+
我有上面的两个数据表。该parent_id
列定义 metadata_items 中的每一行如何与任何其他行相关,这也可以通过每一行的guid
. parent_id
可以由具有孩子的根 ID 嵌套,并且该孩子有孩子(如果有意义的话)。target_metadata_item_id
来自的列与表media_subscriptions
的列相关。我想根据搜索从表中获取具有关联记录的任何记录。最终,如果有匹配的记录,计数应该只为 1,如果没有,则为 0,但我正在使用以防表中存在重复记录,然后我只是在其他地方检查它是否返回.id
metadata_items
COUNT(*)
metadata_items
media_subscriptions
guid
COUNT(*)
media_subscriptions
> 0
我正在尝试完成的一些示例:
guid='id://841'
将返回 1,因为它的根父 id (19039) 被id
30 in引用media_subscriptions
。guid='id://841/1/1'
将返回 1,因为它的根父 id (19039) 被id
30 in引用media_subscriptions
。guid='id://290'
将返回 0,因为它的根父 id (19967) 没有被media_subscriptions
.
这就是我现在所拥有的,这显然没有按我的预期工作(放轻松,我是数据库管理的菜鸟,并且刚刚开始学习)。
SELECT COUNT(*) FROM `metadata_items` AS `t1`
LEFT JOIN `metadata_items` AS `t2` ON t1.id = t2.parent_id
INNER JOIN `media_subscriptions` AS `subscriptions` ON t1.id = subscriptions.target_metadata_item_id
WHERE t1.guid='id://841'
这正确地返回 1,但是如果我切换最后一行,WHERE t1.guid='id://265/1/1'
它会返回 0,我希望它返回 1。显然我这样做非常不正确,但我真的不确定如何去获得我的位置需要。
测试
小提琴
如果您只需要一条单独记录的数据,则添加适当的 WHERE。