Mysql, НЕ СУЩЕСТВУЕТ, ВЫБЕРИТЕ

0

Ну, я пытался выбрать строки из одной таблицы, если в другой таблице нет строк.

Мой первоначальный запрос:

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

Теги:

3 ответа

5
Лучший ответ

EXISTS поддерживается только в 4.1 и выше - документация, которую вы связываете, представляет собой комбинированную документацию для 4.0/4.1, поэтому она может вводить в заблуждение относительно того, какие версии фактически поддерживают ключевое слово.

Поскольку вы обновили свой вопрос, указав, что используете 4.0.x, поэтому он не работает для вас.

2

Вот еще один способ добиться того же, без использования 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 запроса.

НТН

  • 0
    Спасибо! Я попробую это прямо сейчас.
1

Немного поздно, но я искал что-то подобное, и это может быть полезно кому-то другому. Другой способ сделать это - использовать счет в предложении 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню