Тема по SQL, подобная теме в разделе по ПХП. (специально пометил, чтобы алгоритмы были оптимальны для mySQL). Гуру присоединяйтесь! 1) Задача: найти все записи в таблице 1, которых нет в таблице 2 Код (PHP): select table1.* from table1 left join table2 on table2.id = table1.id where table2.id is null п.с. надеюсь все понимают, что это схема и в реальных запросах надо использовать реальные метки таблиц и полей
Пример того, как можно отсортировать, к примеру, цены товара, но так, чтобы товар с ценой == 0 всегда был в конце списка (пример в песочнице): Код (PHP): SELECT * FROM `products` ORDER BY IF( `price` = 0, 1, 0 ) , `price` [ASC | DESC] /* или с помощью CASE */ SELECT * FROM `products` ORDER BY CASE `price` WHEN 0 THEN 1 ELSE 0 END , `price` [ASC | DESC]
2) Дата воскресенья текущей недели PHP: select date(now() + interval (6 - weekday(now())) day) as sunday
@Deonis то же, но с использованием UNION ALL (здесь скобки важны!) Код (PHP): /* По возрастанию */ (SELECT * FROM `products` WHERE `price`<>0 ORDER BY `price` ASC) UNION ALL (SELECT * FROM `products` WHERE `price`=0) http://sqlfiddle.com/#!9/792d1/6
3) Вывести случайное значение поля при GROUP BY. Навеяно темой "Задачка про выбор случайного из группы". Вероятно, один из самых оптимальных вариантов - без временных таблиц и подзапросов: PHP: select age, SUBSTRING_INDEX(min(concat_ws('|', rand(), name)), '|', -1) rand_name from test_group_by_rand group by age Имена/метки на основе навеянной темы. Структура таблицы: PHP: CREATE TABLE `test_group_by_rand` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) DEFAULT NULL COMMENT 'Имя', `age` int(11) DEFAULT NULL COMMENT 'Возраст', KEY `k_test_gr` (`age`) )
artoodetoo говорил про возможность вывода связанных полей, при таком запросе полей таблицы: Код (Text): CREATE TABLE children ( `id` integer auto_increment primary key, `name` text, `surname` text, `age` integer ); INSERT INTO children (`name`, `surname`, `age`) VALUES ('Маша', 'Фокина', 3), ('Петя', 'Ждун', 3), ('Саша', 'Иванов', 5), ('Кузьма', 'Прутков', 5), ('Фархат', 'Давлетдинов', 4), ('Зина', 'Писькина', 7), ('Зидан', 'Волапюк', 3), ('Родриго', 'Санчес', 4); выведется Петя Фокина, а не Маша, а так будет правильно: Код (Text): SELECT y.* FROM ( SELECT SUBSTRING_INDEX( GROUP_CONCAT(`id` ORDER BY RAND()), ',', 1) AS `id` FROM `children` GROUP BY `age`) AS x JOIN `children` AS y USING(`id`)
Если нужны доп.данные, просто включите моск. Я думал, что тут и ежу понятно, что min(...) просто лучшая замена GROUP_CONCAT(...) или подзапросу в данной задаче. А дальше по желанию, насколько запрос будет сложным.