使用存储过程。
这里是程序的mysql:CALL GetRooms('RoomTableName','EquipmentTableName','EquipmentIDs')
例:
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `GetRooms`(IN roomtable TEXT, IN equipmenttable TEXT, IN equipments TEXT)
BEGIN
DECLARE statement text;
DECLARE Pos int;
DECLARE cond text;
DECLARE element text;
DECLARE tmpTxt text;
set tmpTxt = equipments;
set cond = "";
set Pos = instr(tmpTxt,';');
while Pos <> 0 do
set element = substring(tmpTxt, 1, Pos-1);
if cond <> "" then
set cond = concat(cond,' and ');
end if;
set cond = concat(cond,'exists (select id from ' , equipmenttable ,' where eq_id=''' , element ,''' and room_id=r.id) ');
set tmpTxt = replace(tmpTxt, concat(element,';'), '');
set Pos = instr(tmpTxt,';');
end while;
if tmpTxt <> "" then
if cond <> "" then
set cond = concat(cond,' and ');
end if;
set cond = concat(cond,'exists (select id from ' , equipmenttable ,' where eq_id=''' , tmpTxt ,''' and room_id=r.id) ');
end if;
SET @statement = concat('Select * FROM ' , roomtable , " WHERE " , cond , ";");
PREPARE stmt FROM @statement;
EXECUTE stmt;
END
与执行它
Call GetRooms('rooms','equipemnts','eq1;eq2;eq3');
希望这有助于。
它也会返回count(id)> = 2的行,只是由于eq1的行(并且可能没有包含eq_id ='eq2'的行)。即它不起作用 – Unreason 2011-01-19 10:38:22
是的,当然,但如果组合“id + eq_id”是唯一的,它将起作用 – vmg 2011-01-19 10:45:33