2015-02-04 3 views
-1

Рассмотрят таблицу, как это:Получить строки из таблицы игнорирования результатов подвыборки

CREATE TABLE IF NOT EXISTS `books` (
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `original_id` int(8) unsigned DEFAULT NULL, 
    `user_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    KEY `original_id` (`original_id`) 
); 


INSERT INTO `books` (`id`, `title`, `original_id`, `user_id`) VALUES 
(14, 'A Title', NULL, 0), 
(26, 'Another title', NULL, 0), 
(27, 'A Third Title', NULL, 0), 
(29, 'A Title', 14, 4), 
(30, 'A Forth Title', NULL, 0), 
(31, 'A Fifth Title', NULL, 0), 
(32, 'A Third Title', 27, 4), 
(33, 'A Sixth Title', NULL, 0), 
(34, 'A Forth Title', 30, 6); 

SQLFiddle: http://sqlfiddle.com/#!2/3857e/1

user_id = 0 являются публичными записями

user_id> 0 являются частными записи возникли из публичная запись, где original_id ссылается на оригинальную запись

Мне нужно получить строки, где текстовый поиск выполняется, за исключением третьей части y записей (без проблем до сих пор) и исходных строк, где были сделаны мои копии.

Можно ли получить его, используя только select + subselect?

+1

Каковы ваши желаемые результаты с вашими данными образца? Не уверен, что я полностью понимаю ваш вопрос. – sgeddes

+0

Привет sgeddes, мне нужно сделать поиск, исключая сторонний (user_id! = Me AND user_id> 0) и исключая оригиналы, скопированные мной. –

+0

Я тоже этого не понимаю. Как сказал sgeddes: «Какие строки результата вы ожидаете? user_id = 0 означает public. user_id> 0 означает private. Какой идентификатор пользователя означает «я»? Какой user_id означает «сторонняя сторона»? Вы ищете запрос с одним user_id? Если да, то какие результаты вы ожидаете для user_id 4, а для user_id 6 и для user_id 3? –

ответ

1

Где "я" 4:

SELECT b1.* FROM books b1 
LEFT JOIN books b2 
    ON b2.original_id = b1.id AND b2.user_id = 4 
WHERE (b1.user_id = 0 AND b2.id IS NULL) 
    OR b1.user_id = 4 

(b1.user_id = 0 AND b2.id IS NULL) получает государственные те, которые я не копируют.

b1.user_id = 4 получает мое.

+0

Отлично. Ты спас свой день. –

1

Некоторые из них могут помочь;

select * from books a 
where a.original_id is null 
and not exists (select 'a' from books b 
where a.id = b.original_id) 
+0

Это будет выглядеть так: 'SELECT * FROM books AS b WHERE title LIKE 'A%' AND (user_id = 0 OR user_id = 4) И не существует (выберите id из книг AS c где b.id = c.original_id) ', но он не возвращает строку 30 (которые были скопированы пользователем 6) –

+0

Спасибо вам любым способом –

+0

Добро пожаловать. Я думаю, что это согласуется с вашим ожиданием «исключить исходные строки, из которых были сделаны мои копии». Извините, что вы не ожидали поведения. –

0

Я все еще не совсем четко понимаю ваши потребности, но что-то вроде этой работы для вас?

SELECT * 
FROM books AS b 
WHERE b.title LIKE '%mySearchStr%' 
    AND b.user_id IN (0, myUserID) 
    AND b.id NOT IN 
    (SELECT DISTINCT b2.original_id 
    FROM books AS b2 
    WHERE b2.user_id NOT IN (0, myUserID) 
    ) 
; 
Смежные вопросы