UPDATE `properties` SET `updated` = 0 WHERE `item_id` = :itemId;
INSERT INTO `properties` (`item_id`, `property_id`, `value`, `updated`)
VALUES (:itemId, :propertyId, :propertyValue, 1)
ON DUPLICATE KEY UPDATE `value` = VALUES(`value`), `updated` = 1;
...
DELETE FROM `properties` WHERE `item_id` = :itemId AND `updated` = 0;
SELECT count(DISTINCT product.id)
FROM `product`
JOIN `product_to_city` ON `product`.`publish` = 1
AND `product`.`archive` != 1 AND `product`.`delete` != 1
AND `product_to_city`.`product_id` = `product`.`id`
JOIN `city` AS `c` ON (`c`.`id` = 104 OR `c`.`parent_id` = 104)
AND `c`.`id` = `product_to_city`.`city_id`
JOIN `city` ON `city`.`id` = `product`.`city_id`
JOIN `company` ON `company`.`id` = `product`.`company_id`
SELECT *
FROM `items`
WHERE MATCH (`name`) AGAINST :searchString
OR `brand_id` IN (SELECT `id` FROM `brands` WHERE MATCH (`name`) AGAINST :searchString)
SELECT `t`.`ID`, `t1`.`VALUE`, `t2`.`VALUE`, ..., `tN`.`VALUE`, `t`.`TIME`
FROM (
SELECT DISTINCT `ID`, `TIME`
FROM `testtable`
) AS `t`
LEFT JOIN `testtable` AS `t1` ON `t1`.`NAME` = :name1
AND `t1`.`ID` = `t`.`ID` AND `t1`.`TIME` = `t`.`time`
LEFT JOIN `testtable` AS `t2` ON `t2`.`NAME` = :name2
AND `t2`.`ID` = `t`.`ID` AND `t2`.`TIME` = `t`.`time`
...
LEFT JOIN `testtable` AS `tN` ON `tN`.`NAME` = :nameN
AND `tN`.`ID` = `t`.`ID` AND `tN`.`TIME` = `t`.`time`
СREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b INT;
DECLARE cur CURSOR FOR SELECT id, data FROM t1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO a, b;
IF done THEN
LEAVE read_loop;
END IF;
здесь выполняются нужные действия
END LOOP;
CLOSE cur;
END
SELECT `time`, GROUP_CONCAT(`worker`)
FROM `table`
GROUP BY `time`