Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выборка уникальных значений
 
 автор: fire_f12   (13.11.2013 в 18:08)   письмо автору
 
 

Требуется выбрать четкое соответствие из базы

SELECT * FROM doc_img_tag dit1 WHERE dit1.img_tag_id in (2,20,40) AND (SELECT count(*) FROM doc_img_tag dit2 WHERE dit2.doc_id = dit1.doc_id) = 3 ; 

Проблема что этот код выбирает все соответствие в разных предствлениях тоесть он может найти 2, 30 , 52 или 2,20,56,73 итд .
Для уникальности на ум приходит только

SELECT *
FROM doc_data dd
WHERE EXISTS 
(
SELECT *
FROM doc_img_tag dit11
WHERE dit11.img_tag_id = 2 and dit11.doc_id = dd.id) AND EXISTS 
(
SELECT *
FROM doc_img_tag dit12
WHERE dit12.img_tag_id = 20  and dit12.doc_id = dd.id) AND 
EXISTS 
(
SELECT *
FROM doc_img_tag dit13
WHERE dit13.img_tag_id = 40  and dit13.doc_id = dd.id) AND (
SELECT COUNT(*)
FROM doc_img_tag dit2
WHERE dit2.doc_id = dd.id) = 5
LIMIT 100000;

Но это как то слишком громоздко , думается что есть способ попроще . Тем более что этот запрос является подзапросом другого запроса и работает на выборке в 1,5 лям

  Ответить  
 
 автор: Sfinks   (13.11.2013 в 21:27)   письмо автору
 
   для: fire_f12   (13.11.2013 в 18:08)
 

Проблема в том, что мы тут понятия не имеем, что из себя представляет ваша таблица doc_img_tag и что в ней что из себя представляет. И даже образца данных нет.

Если хотите, могу предложить наугад:
SELECT DISTINCT * FROM doc_img_tag dit1 WHERE dit1.img_tag_id in (2,20,40) AND (SELECT count(*) FROM doc_img_tag dit2 WHERE dit2.doc_id = dit1.doc_id) = 3
но не более того

  Ответить  
 
 автор: fire_f12   (14.11.2013 в 09:31)   письмо автору
 
   для: Sfinks   (13.11.2013 в 21:27)
 

Таблица очень простая:
id ключ значение
Так сказать связывающее звено , в для одного ключа может быть от 1 до ~800 значений , нужно найти такие ключи которым соответствуют значения поиска и не какие другие . тоесть если заданы 2,20,40 то нужно найти ключи которым соответствую 2,20,40 и не какие другие . следующие значения не удовлетворяют поиск 1,2,20,40 2,20,40,56

  Ответить  
 
 автор: Sfinks   (14.11.2013 в 15:24)   письмо автору
 
   для: fire_f12   (14.11.2013 в 09:31)
 

Ага... Почти.
А id и ключ - это я так понимаю img_tag_id и doc_id. А кто из них кто?
И еще id - уникальное?

  Ответить  
 
 автор: Sfinks   (15.11.2013 в 09:38)   письмо автору
 
   для: fire_f12   (14.11.2013 в 09:31)
 

Посмотрите вот эту тему: http://softtime.ru/forum/read.php?id_forum=3&id_theme=90415#post538127
На сколько я понял, вам нужно тоже самое, только там человек правильно и понятно сформулировал вопрос.
Если так, то у вас будет такой же запрос, только вместо
HAVING count(*) >= 2
будет
HAVING count(*) = 3

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования