Как сделать выборку из MySQL по трем полям с несколькими условиями?

Добрый день! Есть таблица `table`:
CREATE TABLE IF NOT EXISTS `table` (
  `main` int(11) NOT NULL,
  `sid` int(11) DEFAULT NULL,
  `rid` int(11) DEFAULT NULL,
  `nid` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `table`(
      `main`, `sid`, `rid`, `nid`
  ) VALUES(
    1, 8, 1, null),
    (1, null, null, "привет"),
    (2, 8, 1, null),
    (2, 1, 2, null),
    (1, 1, 2, null),

Нужно найти такое поле `main`, где есть записи

sid = 8, rid=1, nid = null ;
sid = null, rid = null, nid = "привет"
sid=1, rid=2, nid = null

Можно выбрать так записи за один запрос?
$d = array(
array('sid' => 8, 'rid' => 1, 'nid' => null),
array('sid' => null, 'rid' => null, 'nid' => 'привет'),
array('sid' => 1, 'rid' => 2, 'nid' => null),
);
//$d - не обязательно должен содержать 3 записи


Объясню на шагах, так как иначе не могу:
1. Берем данные: sid = 8, rid=1, nid = null
Выборка должна дать две записи с main =1 и main =2,
2. Добавляем условие: sid = null, rid = null, nid = "привет"
Выборка должна вернуть только одну запись с main=1

UPD: дополнил вопрос 2.
  • Вопрос задан
  • 3810 просмотров
Пригласить эксперта
Ответы на вопрос 2
SELECT * FROM `table`
WHERE (`sid` = 8 AND `rid` = 1 AND `nid` IS NULL)
OR (`sid` IS NULL AND `rid` IS NULL AND `nid` = "привет")
OR (`sid` = 1 AND rid = 2 AND `nid` IS NULL)
Ответ написан
gillbeits
@gillbeits
select *
from (select b.*
from (select a.*, (
	  if(`sid` = 8 AND `rid` = 1 AND `nid` IS NULL, 1<<0, 0)
	| if(`sid` IS NULL AND `rid` IS NULL AND `nid` = "привет", 1<<1, 0)
	| if(`sid` = 1 AND rid = 2 AND `nid` IS NULL, 1<<2, 0) ) flag
from `table` a
where 1=1) b
group by b.main
having bit_or(b.flag) = 7 )c
join (select a.*, (
	  if(`sid` = 8 AND `rid` = 1 AND `nid` IS NULL, 1<<0, 0)
	| if(`sid` IS NULL AND `rid` IS NULL AND `nid` = "привет", 1<<1, 0)
	| if(`sid` = 1 AND rid = 2 AND `nid` IS NULL, 1<<2, 0) ) flag
from `table` a
where 1=1) d using(main)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы