MySQL Query неправильно выбирает из 2 таблиц соединения - PullRequest
1 голос
/ 04 декабря 2010

Структура таблицы

CREATE TABLE IF NOT EXISTS `blogs` (
  `id` int(11) NOT NULL auto_increment,
  `title` text collate utf8_bin NOT NULL,
  `content` longtext collate utf8_bin NOT NULL,
  `active` tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2768 ;

CREATE TABLE IF NOT EXISTS `pics` (
  `id` int(11) NOT NULL auto_increment,
  `blogid` int(11) NOT NULL default '0',
  `islogo` tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4132 ;

CREATE TABLE IF NOT EXISTS `vdos` (
  `id` int(11) NOT NULL auto_increment,
  `blogid` int(11) NOT NULL default '0',
  `file` varchar(255) collate utf8_bin NOT NULL,
  `title` varchar(255) collate utf8_bin NOT NULL,
  `description` text collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3759 ;

Запрос

select distinct b.id from blogs b 
left join pics p ON b.id = p.blogid 
left join vdos v ON b.id = v.blogid 
where p.islogo = '0' and b.`active` = '1'

Я собираюсь перечислить идентификаторы блогов, в которых есть изображения или видео.Этот запрос выполняет только те блоги, в которых есть изображения, и не содержит идентификаторов блогов, в которых есть только видео.

Кто-нибудь может увидеть, что я делаю неправильно?

Ответы [ 3 ]

3 голосов
/ 04 декабря 2010

Это потому, что вы установили условие, что pics.islogo равно '0'. Это никогда не может быть '0' для блогов без картинок. Переместите условие в объединение:

select distinct b.id from blogs b 
left join pics p ON b.id = p.blogid and p.islogo = '0'
left join vdos v ON b.id = v.blogid
where b.`active` = '1'
1 голос
/ 04 декабря 2010

p.islogo - это то, что вызывает только блог с картинками.Вам также нужно будет сделать

where p.islogo = '0' and b.`active` = '1' or p.islogo IS NULL

, чтобы сопоставить блоги без картинок.

Редактировать: Извините, изначально неправильно прочитал вопрос.Предложение where, вероятно, следует изменить на

WHERE (p.islogo = "0" AND p.id IS NOT NULL) OR (v.id IS NOT NULL)
0 голосов
/ 04 декабря 2010
select from blogs b 
left join pics p ON b.id = p.blogid 
left join vdos v ON b.id = v.blogid 
where p.islogo = '0' and b.`active` = '1' GROUP BY b.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...