0

How obtain in case that in table userItems is not record joined with moduleItems just null?

SELECT `users`.*, `useritems`.*, `moduleitems`.*, `modulesubitems`.* FROM `users`
LEFT JOIN `useritems` ON useritems.f_user_id = users.user_id
LEFT JOIN `moduleitems` ON moduleitems.moduleItem_id = useritems.f_moduleItem_id
LEFT JOIN `modulesubitems` ON modulesubitems.modulesubitem_id = useritems.userItem_value

Edit: My DB structure

CREATE TABLE IF NOT EXISTS `moduleitems` (
`moduleItem_id` int(11) NOT NULL AUTO_INCREMENT,
`f_module_id` int(11) NOT NULL,
PRIMARY KEY (`moduleItem_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=63 ;

CREATE TABLE IF NOT EXISTS `modules` (
`module_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`module_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

CREATE TABLE IF NOT EXISTS `modulesubitems` (
`moduleSubitem_id` int(11) NOT NULL AUTO_INCREMENT,
`f_moduleItem_id` int(11) NOT NULL,
PRIMARY KEY (`moduleSubitem_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;

CREATE TABLE IF NOT EXISTS `useritems` (
`f_user_id` int(11) NOT NULL,
`f_moduleItem_id` int(11) NOT NULL,
`userItem_value` varchar(255) DEFAULT NULL,
PRIMARY KEY (`f_user_id`,`f_moduleItem_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=35 ;
4

2 に答える 2

1

useritems テーブルに一致するレコードがあるかどうかに関係なく、各ユーザーのすべての moduleitem を表示したい場合は、次のようにします。

SELECT  `users`.*, `useritems`.*, `moduleitems`.*, `modulesubitems`.* 

FROM    `users`

        CROSS JOIN `moduleitems`

        LEFT JOIN `useritems` 
        ON useritems.f_user_id = users.user_id
        AND moduleitems.moduleItem_id = useritems.f_moduleItem_id

        LEFT JOIN `modulesubitems` 
        ON modulesubitems.modulesubitem_id = useritems.userItem_value
于 2013-02-20T16:03:36.030 に答える
0

結合されたテーブルに含まれていないすべてのレコードを検索しようとしている場合 (LEFT JOIN を使用している場合)、そのテーブルで結合しているフィールドが NULL である WHERE 句に追加します。一致しない場合、結合テーブルのすべてのフィールドは NULL になります。

たとえば、これは、moduleitems テーブルに一致するものがない場合を見つけようとしている場合に機能します。

SELECT `users`.*, `useritems`.*, `moduleitems`.*, `modulesubitems`.* 
FROM `users`
LEFT JOIN `useritems` ON useritems.f_user_id = users.user_id
LEFT JOIN `moduleitems` ON moduleitems.moduleItem_id = useritems.f_moduleItem_id
LEFT JOIN `modulesubitems` ON modulesubitems.modulesubitem_id = useritems.userItem_value
WHERE moduleitems.moduleItem_id IS NULL
于 2013-02-20T14:10:11.243 に答える