Ну, я пытался выбрать строки из одной таблицы, если в другой таблице нет строк.
Мой первоначальный запрос:
SELECT * FROM `jos_datsogallery` as a WHERE a.published = 1
and a.approved=1 NOT EXISTS (SELECT * FROM `jos_datsogallery_votes`
As v WHERE v.vip=62 AND v.vpic=a.id) ORDER BY a.imgdate DESC
но он продолжает терпеть неудачу.
Я провел несколько тестов и сократил свой запрос до:
SELECT * FROM `jos_datsogallery` WHERE EXISTS (SELECT 1)
Предпочитается выбрать все из jos_datsogallery, поскольку "EXISTS (SELECT 1)" всегда истинно.
Я пробовал phpMyAdmin:
1064 - У вас есть ошибка в синтаксисе SQL. Проверьте руководство, которое соответствует вашему серверу MySQL версии для правильного синтаксиса для использования рядом с "EXISTS (SELECT 1) LIMIT 0, 30 ' в строке 1
Что не так?
Версия MySQL: 4.0.27
MySQL doc: http://dev.mysql.com/doc/refman/4.1/en/exists-and-not-exists-subqueries.html
EXISTS
поддерживается только в 4.1 и выше - документация, которую вы связываете, представляет собой комбинированную документацию для 4.0/4.1, поэтому она может вводить в заблуждение относительно того, какие версии фактически поддерживают ключевое слово.
Поскольку вы обновили свой вопрос, указав, что используете 4.0.x, поэтому он не работает для вас.
Вот еще один способ добиться того же, без использования NOT EXISTS
.
SELECT * FROM `jos_datsogallery` AS a
LEFT JOIN `jos_datsogallery_votes` AS v ON v.vip=62 AND v.vpic=a.id
WHERE a.published = 1 AND
a.approved=1 AND
v.vip IS NULL
ORDER BY a.imgdate DESC
Использование левого соединения означает, что правая часть соединения (часть jos_datsogallery_votes
) не может найти какие-либо строки, все еще возвращая результат. Когда правая сторона соединения не найдена, ее столбцы будут иметь значение NULL, которое вы можете проверить в части WHERE запроса.
НТН
Немного поздно, но я искал что-то подобное, и это может быть полезно кому-то другому. Другой способ сделать это - использовать счет в предложении where. Таким образом, ваш запрос будет выглядеть следующим образом:
SELECT * FROM `jos_datsogallery` AS a
WHERE a.published = 1
AND a.approved=1
AND (
SELECT COUNT(*) FROM `jos_datsogallery_votes` AS v
WHERE v.vip=62
AND v.vpic=a.id
) = 0
ORDER BY a.imgdate DESC