我有这样的基础结构(短版)
表产品:
product_id, name, status
1, Product 1, 1
2, Product 2, 1
3, Product 3, 1
4, Product 4, 1
99, Product 99, 1
表格框
box_id, name
1, Box 1
表Product_To_Box:
box_id, product_id
1, 1
1, 2
1, 3
1, 4
1, 99
表格网址(表格'产品'中的ID = product_id)
url_id, id, url, language_id
1, 1, wp.pl, 1
2, 1, wp.pl, 2
3, 2, google.pl, 1
表格语言:
language_id, name
1, English
2, Polish
当我需要从表'产品'中下载所有产品时没有问题,这些产品不在表'url'中,并且被分配了'box_id'。 我做这个查询
SELECT p.product_id AS id FROM product p LEFT JOIN product_to_box p2b ON (p.product_id = p2b.product_id) WHERE NOT EXISTS (SELECT u.id FROM url u WHERE p.product_id = u.id) AND p2b.box_id = '1'
返回3个产品:
Product 3
Product 4
Product 99
但是,他需要一个将返回上述项目的查询,还需要与表格“语言”中的每种语言无关的产品
查询应返回4个产品:
Product 2 - return the product because the table 'url' no entry for language_id = 2
Product 3
Product 4
Product 99
如何在表格'语言'中添加其他语言,例如。越南(language_id = 3)和表'url'看起来像这样
1, 1, wp.pl, 1
2, 1, wp.pl, 2
3, 2, google.pl, 1
3, 2, google.pl, 2
3, 3, google.com, 1
3, 3, google.com, 2
3, 4, onet.pl, 1
3, 4, onet.pl, 2
3, 99, interia.pl, 1
3, 99, interia.pl, 2
此查询应返回所有产品,因为表'url'没有引用language_id = 3
Product 1
Product 2
Product 3
Product 4
Product 99
答案 0 :(得分:1)
这是您的查询:
SELECT product_id as id
FROM (SELECT p.product_id,
p2b.box_id as box_id,
(SELECT COUNT(1)
FROM url u
WHERE p.product_id = u.id) AS prod_lang_cnt,
(SELECT COUNT(1)
FROM LANGUAGE l) AS lang_cnt
FROM product p
LEFT JOIN product_to_box p2b ON (p.product_id = p2b.product_id)) x
WHERE 1=1
AND x.box_id = '1'
and prod_lang_cnt < lang_cnt
答案 1 :(得分:0)
所以我认为你查询的问题是子查询“NOT EXISTS(SELECT u.id FROM url u WHERE p.product_id = u.id)”。目前您的SQL查询甚至没有查看语言表,因此如果匹配的language_ids则无关紧要。但是,如果要将所有表连接在一起并显示所有product_to_box.id = 1,则以下查询将起作用:
Set<String> savedStringSet = myPrefs.getStringSet("my_saved_strings", Collections.<String>emptySet());
下面的SQL将显示表'product'中的所有product_id,这在表'url'中找不到,并且没有从表'language'中分配所有language_id。它会检查url.id或language_id是否为空。
SELECT p.product_id AS id, url_id, url, l.name FROM product p LEFT JOIN product_to_box p2b ON (p.product_id = p2b.product_id)
LEFT JOIN url ON (p.product_id = url.id) LEFT JOIN language l ON (url.language_id = l.language_id)
WHERE p2b.box_id = '1';
This outputs the following:
+------+--------+-----------+---------+
| id | url_id | url | name |
+------+--------+-----------+---------+
| 1 | 1 | wp.pl | English |
| 1 | 2 | wp.pl | Polish |
| 2 | 3 | google.pl | English |
| 3 | NULL | NULL | NULL |
| 4 | NULL | NULL | NULL |
| 99 | NULL | NULL | NULL |
+------+--------+-----------+---------+
6 rows in set (0.00 sec)