2012-06-04 2 views
1
$sql1 = "SELECT questions FROM last_check_date WHERE user_id=? ORDER BY questions DESC LIMIT 1"; 
$sql2 = "SELECT id FROM questions WHERE add_dt>?"; 

Что делают заявления выше?Оптимизация операторов sql для снижения нагрузки на сервер MySQL

Когда я выполняю sql1, он получает последнюю дату проверки для пользователя.

Затем я выполняю второй запрос, чтобы получить все идентификаторы, где дата добавления> последняя дата проверки (от sql1), и возвращать число обратных строк.

Что я хочу сделать, это объединить эти 2 оператора в 1 и оптимизировать количество запросов. Может возникнуть следующая проблема:

Нет строки для пользователя в $sql1: необходимо выбрать все строки в sql2 и вернуть число обратных строк.

Я не могу понять, как он должен выглядеть .. Thx заранее

UPDATE

SHOW CREATE TABLE last_check_date; результат

CREATE TABLE `last_check_date` (
    `id` int(11) unsigned NOT NULL, 
    `user_id` bigint(20) unsigned NOT NULL, 
    `questions` datetime DEFAULT NULL, 
    `users` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

И SHOW CREATE TABLE questions;

CREATE TABLE `questions` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `author_id` bigint(20) unsigned DEFAULT NULL, 
    `question` text NOT NULL, 
    `var_a` text NOT NULL, 
    `var_b` text NOT NULL, 
    `var_c` text NOT NULL, 
    `var_d` text NOT NULL, 
    `var_e` text NOT NULL, 
    `subject` int(11) unsigned DEFAULT NULL, 
    `chapter` int(11) unsigned DEFAULT NULL, 
    `section` int(11) unsigned DEFAULT NULL, 
    `paragraph` int(11) unsigned DEFAULT NULL, 
    `rank` tinyint(2) NOT NULL, 
    `add_dt` datetime NOT NULL, 
    `answer` varchar(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_chapters-id` (`chapter`), 
    KEY `fk_paragraphs-id` (`paragraph`), 
    KEY `fk_subjects-id` (`subject`), 
    KEY `fk_sections-id` (`section`), 
    KEY `fk_author-id` (`author_id`), 
    CONSTRAINT `fk_author-id` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT `fk_chapters-id` FOREIGN KEY (`chapter`) REFERENCES `chapters` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT `fk_paragraphs-id` FOREIGN KEY (`paragraph`) REFERENCES `paragraphs` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT `fk_sections-id` FOREIGN KEY (`section`) REFERENCES `sections` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT `fk_subjects-id` FOREIGN KEY (`subject`) REFERENCES `subjects` (`id`) ON DELETE SET NULL ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 
+0

, который должен быть с JOIN, нам нужно узнать больше о структуре таблиц, чтобы узнать, какой столбец является достоянием – jcho360

+1

, пожалуйста, напишите 'SHOW CREATE TABLE last_check_date;' и 'SHOW CREATE TABLE questions;' результаты. С другой стороны, довольно неясно, что вы на самом деле извлекаете и/или типы данных: что должно быть столбцом «вопросы»? Определенно не право на дату? – Sebas

+0

@Sebas yed это дата. Как вы видите из названия таблиц, есть все даты внутри – heron

ответ

1
$sql = " 
    SELECT q.id 
    FROM questions q 
    LEFT JOIN (
     SELECT questions 
     FROM last_check_date 
     WHERE user_id=? 
     ORDER BY questions 
     DESC LIMIT 1 
    ) l ON q.add_dt > l.questions" 

$rs = mysql_query($sql); 
$rowcount = mysql_num_rows($rs); 

Я еще не знаю правильный синтаксис для PDO/Mysqli, пожалуйста, приспосабливается к вашему предпочитаемому водителю.

+0

Что делать, если таблица last_check_date пуста? В моем случае он возвращает 0, даже если в таблице вопросов есть 3 вопроса – heron

+0

, левое соединение будет включать в себя нулевые значения из объединенной таблицы. Поэтому, если из подзапроса ничего не возвращается, все строки из 'questions q' должны быть возвращены. – Sebas

1

Ниже , Я предположил, что если в last_check_date нет записей, вы все равно хотите показать вопросы (в этом случае все они).

select q.id 
from questions q 
left outer join (
    select max(questions) as questions 
    from last_check_date 
    where user_id = ? 
) lcd on q.add_date > lcd.questions 
where user_id = ? 
order by questions desc 
+0

обновленный вопрос. пожалуйста, посмотрите – heron

+0

Зачем ограничивать 1 ?? Если нет записей, это означает, что пользователь еще не поставил вопрос. Он должен возвращать все вопросы. – heron

+0

@epic_syntax Ой, опечатка. Удалено сейчас. – RedFilter

Смежные вопросы