mariadb 如何在列可以为NULL的情况下使用条件JOIN ON?

z9ju0rcb  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(122)

我正在为当地的一个教堂建立一个Hamper网站,用于他们的圣诞节篮子驱动器,我正在寻找一些关于如何实现所需MySQL查询/结果的指导。姓名、地址、电话号码......为了得到正确的信息,我写了一个查询,第一个SELECT ... FROM clients as c JOIN hampers as h ON ...为了简单起见,(第一个)clients表如下所示:
| 标识符|hamble_id(索引)默认值为空|姓名|
| - -| - -| - -|
| 一个|2个|约翰·多伊|
| 2个|零值|简·多伊|
| 三个|零值|杰克·多伊|
hampers表如下所示:
| 标识符|客户端标识非空|障碍_no|创建日期|
| - -| - -| - -| - -|
| 一个|一个|第001号|2021年1月1日|
| 2个|一个|C012系列|2022年1月1日|
| 三个|2个|F001系列|2022年1月1日|
所需的查询如下所示。

SELECT h.`id` AS h_id, h.`client_id` AS c_id, IF(YEAR(h.`created_date`)=2022, h.`hamper_no`, NULL) AS hamper_no, YEAR(h.`created_date`) AS h_year, c.`id`, `hamper_id`, `name` FROM `clients` AS c LEFT JOIN `hampers` AS h ON (c.`id` = h.`client_id` AND IF(c.`hamper_id` IS NULL, NULL, c.`hamper_id`) = h.`id`) ORDER BY `name`;

| h_id(_I)|c_标识|障碍_no| h_年|标识符|障碍标识|姓名|
| - -| - -| - -| - -| - -| - -| - -|
| 2个|一个|C012系列|小行星2022|一个|2个|约翰·多伊|
| 零值|零值|零值|零值|2个|零值|简·多伊|
| 零值|零值|零值|零值|三个|零值|杰克·多伊|
当它应该看起来像这样:
| h_id(_I)|c_标识|障碍_no| h_年|标识符|障碍标识|姓名|
| - -| - -| - -| - -| - -| - -| - -|
| 2个|一个|C012系列|小行星2022|一个|2个|约翰·多伊|
| 三个|2个|F001系列|小行星2022| 2个|零值|简·多伊|
| 零值|零值|零值|零值|三个|零值|杰克·多伊|
但是问题是c.hamper_id可能是NULL(从hampers中分离)。我正在寻找一个类似于上面的结果,其中我可以有一个与最近的hampers/client匹配的不同结果。这将用于多个客户端。
如何在不使用c.hamper_id或使用条件的情况下,将结果从潜在的多个障碍缩小到每个客户端只有1个障碍?
另一个需要注意的是,这是一个客户端索引,可能没有任何连接障碍......因此,JOIN列最好使用空值。

k3fezbri

k3fezbri1#

基于https://stackoverflow.com/a/2111420/3095210
这是一个经常出现在StackOverflow上的最大每组n个问题的例子。

SELECT h1.`id`                                                  AS h_id,
       h1.`client_id`                                           AS c_id,
       IF(YEAR(h1.`created_date`) = 2022, h1.`hamper_no`, NULL) AS hamper_no,
       YEAR(h1.`created_date`)                                  AS h_year,
       c.`id`,
       `hamper_id`,
       `name`
FROM `clients` AS c
         LEFT JOIN `hampers` AS h1
              ON c.`id` = h1.`client_id`
         LEFT OUTER JOIN `hampers` AS h2
                         ON (
                                     c.id = h2.client_id
                                 AND
                                     (
                                                 h1.created_date < h2.created_date
                                             OR
                                                 (
                                                             h1.created_date = h2.created_date
                                                         AND h1.id < h2.id
                                                     )
                                         )
                             )
WHERE h2.id IS NULL
ORDER BY `name`;

| h_id(_I)|c_标识|障碍_no| h_年|标识符|障碍标识|姓名|
| - -| - -| - -| - -| - -| - -| - -|
| 零值|零值|零值|零值|三个|零值|杰克·多伊|
| 三个|2个|F001系列|小行星2022| 2个|零值|"DOE,简"|
| 2个|一个|C012系列|小行星2022|一个|2个|约翰·DOE|

相关问题