簡體   English   中英

Mysql 左連接與雙同表關系 where 子句

[英]Mysql left join with double same-table relation where clause

基本上我有這兩個簡單的 mysql 表:

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) NOT NULL,
  `relation` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `mytable` (
  `id` int(10) UNSIGNED NOT NULL,
  `user` int(10) UNSIGNED NOT NULL,
  `data` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `tier` tinyint(3) UNSIGNED NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL COMMENT 'same table'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `users` (`id`, `name`, `relation`) VALUES
(12, 'user1', 5),
(20, 'user2', NULL),
(21, 'user3', NULL);

INSERT INTO `mytable` (`id`, `user`, `data`, `tier`, `parent_id`) VALUES
(1, 12, 'test1', 1, NULL),
(2, 20, 'test2', 2, 1),
(3, 21, 'test3', 3, 1),
(4, 20, 'test4', 1, NULL);

我需要 select 'mytable' 中與users.relation = 5相關的所有行

為此,我使用以下查詢:

SELECT mytable.*
FROM mytable
    LEFT JOIN users ON mytable.user = users.id
WHERE users.relation = 5

問題是我還需要 select mytable中具有與上述結果相關的parent_id的行。

WHERE mytable.id = X OR mytable.parent_id = X

基本上在這個例子中,預期的 output 應該是 mytable 除了最后一行之外的所有行(因為沒有連接 users.relation = 5)

您需要另一個mytable連接到您的查詢:

SELECT m.* 
FROM mytable m INNER JOIN (
  SELECT m.* 
  FROM mytable m 
  INNER JOIN users u ON m.user = u.id 
  WHERE u.relation = 5
) t ON t.id IN (m.id, m.parent_id)

我將聯接更改為INNER聯接,因為盡管您使用LEFT ,但WHERE子句將其更改為INNER ,因為它會過濾掉任何不匹配的行。

請參閱演示
結果:

> id | user | data  | tier | parent_id
> -: | ---: | :---- | ---: | --------:
>  1 |   12 | test1 |    1 |      null
>  2 |   20 | test2 |    2 |         1
>  3 |   21 | test3 |    3 |         1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM