构建一个mysql查询

时间:2015-10-10 13:02:02

标签: mysql

我有这样的基础结构(短版)

表产品:

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

2 个答案:

答案 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)