我的数据位于一张表中,但该表具有分层数据,如下所示。下面也是我想要从表中获取的数据的混淆转储。
以下是与我的问题相关的源数据。
+-----+---------+-----------------+-----------+
| id | item_id | item_inherit_id | item_name |
+-----+---------+-----------------+-----------+
| 26 | 46 | 0 | Item 26 |
| 87 | 230 | 0 | Item 87 |
| 435 | 870 | 0 | Item 435 |
| 440 | 876 | 1563 | Item 440 |
| 469 | 907 | 0 | Item 469 |
| 475 | 913 | 942 | Item 475 |
| 483 | 942 | 0 | Item 483 |
| 680 | 1516 | 0 | Item 680 |
| 689 | 1563 | 0 | Item 689 |
+-----+---------+-----------------+-----------+
这是表格的结构。
| table | CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`item_id` int(11) DEFAULT '0',
`item_inherit_id` int(11) DEFAULT '0',
`item_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`faction` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`points` int(11) NOT NULL DEFAULT '0',
`has_reward` int(11) NOT NULL DEFAULT '0',
`completed` enum('No','Yes') COLLATE utf8_unicode_ci DEFAULT 'No',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6692 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
我想要从表中获得的数据是
has_reward
字段设置为 1 且 completed
设置为“否”的所有项目。在满足该条件的所有项目中,我想对任何存储在 item_id
中的 item_inherit_id
的项目进行额外搜索。
主查询将返回我想要的部分内容,循环查询是我想与循环查询合并的内容,可能使用联合或子查询。
主要查询:
SELECT `id`, `item_name`
FROM `table`
where faction IN ('A', 'Both', '')
AND `has_reward` = 1 AND `completed` = "No" AND `points` <> 0
循环查询:
SELECT `id`, `item_name`
FROM `table`
WHERE faction IN ('A', 'Both', '')
AND `item_inherit_id` = %d;
您可以使用单个 SQL 查询来完成此操作,该查询使用 JOIN 将主查询与循环查询组合起来。
SELECT
t1.`id`,
t1.`item_name`
FROM
`table` AS t1
LEFT JOIN
`table` AS t2 ON t1.`item_id` = t2.`item_inherit_id`
WHERE
t1.`faction` IN ('A', 'Both', '')
AND t1.`has_reward` = 1
AND t1.`completed` = 'No'
AND t1.`points` <> 0
AND (t2.`id` IS NOT NULL OR t1.`item_inherit_id` = 0);