没有行的MySQL内部加入

时间:2018-02-22 21:06:11

标签: mysql

我有一个我规范化的MySQL数据库,其想法是允许企业选择零个或多个营销序列,但是踢球者需要一些营销序列(现在我有4个,但是列表可以成长)。所以我所做的就是构建我的表格:

sequence
+-------------+------------------+-------+-------------+----------+
| sequence_id | customer_type_id | title | description | required |
|     1       |        1         |  ...  |     ...     |   true   |
|     2       |        1         |  ...  |     ...     |   true   |
|     3       |        1         |  ...  |     ...     |   false  |
|     4       |        2         |  ...  |     ...     |   true   |
|     5       |        3         |  ...  |     ...     |   true   |
|     6       |        4         |  ...  |     ...     |   false  |
+-------------+------------------+-------+-------------+----------+

business_sequence
+----------------------+-------------+-------------+
| business_sequence_id | business_id | sequence_id |
+----------------------+-------------+-------------+

customer_type_idbusiness_id是外键字段,链接到描述客户类型(客户,以前的客户等)和业务信息(名称,地址,等)。

我在序列表中有required列的原因是,如果企业决定不允许任何不需要的序列,那么该业务就不需要一行。毕竟,如果唯一不同的数据是business_id字段,则不需要在business_sequence表中有重复的行。

现在我要做的是获取序列表中的所有行和所有字段,其中business_sequence表中的business_id与参数化值匹配(例如,对于我要去的示例,请为1)在一秒钟内显示。我尝试使用的查询是:

SELECT 
    s.*
FROM
    `sequence` AS s
  INNER JOIN `business_sequence` AS b ON b.`sequence_id` = s.`sequence_id`
WHERE
  b.`business_id` = 1 AND
  s.`required` = true;

但是如果业务在序列表中没有行,则返回没有结果。我期望它做的是从b.business_id = 1返回0行,但我也期望它返回4" required"来自s.required = true的行(ID:1,2,4和5)。

每当我拿出INNER JOIN语句和WHERE子句的business_id部分时,它确实会返回4" required"行。这使我相信在我的原始查询中,因为sequence表中没有针对该特定business_id的行,所以它不会返回任何内容。

说完所有这些,当business_id字段与参数化值匹配时,如何检索零行或多行?在{{1>时检索所有行} field是真的吗?

2 个答案:

答案 0 :(得分:0)

如何使用OR条件代替AND?

SELECT 
    s.*
FROM
    `sequence` AS s
  INNER JOIN `business_sequence` AS b ON b.`sequence_id` = s.`sequence_id`
WHERE
  b.`business_id` = 1 OR
  s.`required` = true;

答案 1 :(得分:0)

我能够通过执行UNION来解决我的问题:

SELECT * FROM `sequence` WHERE `required` = true
UNION
SELECT 
  s.*
FROM
  `sequence` AS s
  INNER JOIN `business_sequence` AS b ON b.`sequence_id` = s.`sequence_id`
WHERE
  b.`business_id` = 1