Реклама на сайте Advertise with us

Сложный запрос в MySQL

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 02.01.04
Сообщения: 1246
Рейтинг: 54

Ссылка на сообщениеДобавлено: 02/04/07 в 23:41       Ответить с цитатойцитата 

Наверно надо немного на другой форум, но все таки icon_smile.gif

Суть такая. Храню инфу о спонсорском сайте в двух таблицах. В первой общую инфу по сайту, напр:

CREATE TABLE sponsorsite (
sponsorsiteID INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
url VARCHAR(128) NOT NULL
);

Во второй к каким категориям принадлежит сайт, ну напр азиатские тины принадлежат и в категорию ASIAN (8) и TEEN (2):

CREATE TABLE categorysponsorsite (
categorysponsorsiteID INT PRIMARY KEY AUTO_INCREMENT,
sponsorsiteID INT NOT NULL,
categoryID INT NOT NULL
);

1) Пытаюсь выбрать сайты которые принадлжат вышеуказанным двум категориям, но выдает ноль результатов, вот запрос:

select sponsorsite.name, sponsorsite.url from sponsorsite, categorysponsorsite where (categorysponsorsite.categoryID=8 AND categorysponsorsite.categoryID=2) AND categorysponsorsite.sponsorsiteID=sponsorsite.sponsorsiteID;

А если оставить только одну категорию (напр categorysponsorsite.categoryID=2), то нормально выдает тинов.

2) Пробовал использовать JOIN, что то не выходит, напр:

SELECT name, url FROM sponsorsite LEFT JOIN categorysponsorsite on sponsorsite.sponsorsiteID=categorysponsorsite.sponsorsiteID WHERE (categorysponsorsite.categoryID=8 AND categorysponsorsite.categoryID=2);


--

Извиняюсь если натупил, давно не программил icon_smile.gif

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 03/04/07 в 00:00       Ответить с цитатойцитата 

Цитата:
ategorysponsorsite.categoryID=8 AND categorysponsorsite.categoryID=2

замени на
Цитата:
ategorysponsorsite.categoryID=8 OR categorysponsorsite.categoryID=2

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

3
 



С нами с 02.01.04
Сообщения: 1246
Рейтинг: 54

Ссылка на сообщениеДобавлено: 03/04/07 в 00:03       Ответить с цитатойцитата 

Stek писал:
замени на


Пробовал, вроде как не то.. выдает и тинов и азиаток, всего 20 напр выдает.. а нужно сайты которые азиатские тины только.. такой один..

Может еще кто сможет подсказать?

0
 

БешаныйСуслег

С нами с 16.06.04
Сообщения: 1322
Рейтинг: 1338

Ссылка на сообщениеДобавлено: 03/04/07 в 00:15       Ответить с цитатойцитата 

Stek: не, тогда будут либо азиаты либо тины.

Попробуй сделать GROUP и где COUNT = 2.

Код:

select sponsorsite.name, sponsorsite.url from sponsorsite, categorysponsorsite, COUNT(*) cnt where (categorysponsorsite.categoryID=8 OR categorysponsorsite.categoryID=2) AND categorysponsorsite.sponsorsiteID=sponsorsite.sponsorsiteID GROUP BY sponsorsite.sponsorsiteID HAVING cnt = 2;


Второй вариант сделать двойной джойн.

Код:

select sponsorsite.name, sponsorsite.url from sponsorsite, categorysponsorsite FROM categorysponsorsite c1 JOIN sponsorsite s1 USING( sponsorsiteID ) JOIN categorysponsorsite c2 ON (s1.sponsorsiteID = c2.sponsorsiteID ) where (c1.categoryID=8 AND c2.categoryID=2);


Возможно написав хуню, но хотел помочь от чистого сердца icon_biggrin.gif

3
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 03/04/07 в 00:16       Ответить с цитатойцитата 

тогда тебе через 3 таблицы делать надо.
Код:

SELECT
  sponsorsite.*
FROM
categorysponsorsite categorysponsorsite1
INNER JOIN sponsorsite ON (categorysponsorsite1.sponsorsiteID=sponsorsite.sponsorsiteID)
INNER JOIN categorysponsorsite ON (sponsorsite.sponsorsiteID=categorysponsorsite.sponsorsiteID)
WHERE
  (categorysponsorsite.categoryID = 8) AND
  (categorysponsorsite1.categoryID = 2)

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

3
 



С нами с 24.03.03
Сообщения: 553
Рейтинг: 794

Ссылка на сообщениеДобавлено: 03/04/07 в 06:56       Ответить с цитатойцитата 

А не проще ли использовать IN?

Типа

WHERE categorysponsorsite.categoryID IN ('8','2')

3
 

no sign

С нами с 25.07.03
Сообщения: 3623
Рейтинг: 1403

Ссылка на сообщениеДобавлено: 03/04/07 в 07:09       Ответить с цитатойцитата 

leo1 писал:
Типа

WHERE categorysponsorsite.categoryID IN ('8','2')


это будет аналогом OR
а тут требуется немного другая выборка
как именно - в принципе Stek написал icon_smile.gif

у меня по крайней мере идей других нет icon_smile.gif

skype:megaarachno

3
 



С нами с 02.01.04
Сообщения: 1246
Рейтинг: 54

Ссылка на сообщениеДобавлено: 03/04/07 в 10:39       Ответить с цитатойцитата 

Спасибо всем за старание icon_smile.gif

ghood писал:
Stek: не, тогда будут либо азиаты либо тины.

Попробуй сделать GROUP и где COUNT = 2.

Код:

select sponsorsite.name, sponsorsite.url from sponsorsite, categorysponsorsite, COUNT(*) cnt where (categorysponsorsite.categoryID=8 OR categorysponsorsite.categoryID=2) AND categorysponsorsite.sponsorsiteID=sponsorsite.sponsorsiteID GROUP BY sponsorsite.sponsorsiteID HAVING cnt = 2;



Ошибку дает:

ERROR 1064 at line 1: You have an error in your SQL syntax near 'COUNT(*) cnt wh
ere (categorysponsorsite.categoryID=8 OR categorysponsorsite.cate' at line 1

Второй вариант сделать двойной джойн.

Код:

select sponsorsite.name, sponsorsite.url from sponsorsite, categorysponsorsite FROM categorysponsorsite c1 JOIN sponsorsite s1 USING( sponsorsiteID ) JOIN categorysponsorsite c2 ON (s1.sponsorsiteID = c2.sponsorsiteID ) where (c1.categoryID=8 AND c2.categoryID=2);


Возможно написав хуню, но хотел помочь от чистого сердца icon_biggrin.gif


Тута тоже ошибка icon_smile.gif

ERROR 1064 at line 1: You have an error in your SQL syntax near 'FROM categorysp
onsorsite c1 JOIN sponsorsite s1 USING( sponsorsiteID ) JOIN cate' at line 1

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 03/04/07 в 11:21       Ответить с цитатойцитата 

Код:
COUNT(*) cnt

неправильно, надо так
Код:
COUNT(*) AS cnt
, если я правильно понял что ты хочешь.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

3
 



С нами с 02.01.04
Сообщения: 1246
Рейтинг: 54

Ссылка на сообщениеДобавлено: 03/04/07 в 16:17       Ответить с цитатойцитата 

Всех оценил, спасибо! А вот и правильный ответ, коллеги icon_smile.gif

SELECT name,url FROM sponsorsite WHERE sponsorsiteID IN
(
SELECT sponsorsiteID
FROM categorysponsorsite WHERE categoryID IN(2,8)
GROUP BY sponsorsiteID
HAVING COUNT(categorysponsorsiteID) = 2
)

Тока не могу даже осмыслить запрос icon_smile.gif

П.с. иформировали меня о нем на соответсвующем форуме.

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 03/04/07 в 16:24       Ответить с цитатойцитата 

Уверен что правильный ?

HAVING COUNT(categorysponsorsiteID) = 2
выбирает из всех предъидущей выборки те сайты , которые принадлежать только двум! категориям.

Т.е. тины - азиатки - в нижнем белье : сюда уже не попадут. А должны, так как они тины - азиатки.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 02.01.04
Сообщения: 1246
Рейтинг: 54

Ссылка на сообщениеДобавлено: 03/04/07 в 16:56       Ответить с цитатойцитата 



Знаешь вроде попадают.. например попал этнический сайт, который и эбони, и латина, и азиатки (и всего у сайта около 7 категорий).. вот, так что вроде все нормально, но я посмотрю, спасибо..

0
 



С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354

Ссылка на сообщениеДобавлено: 03/04/07 в 20:21       Ответить с цитатойцитата 

ну если с запросом порешали от себя могу тока одно посоветовать:
CREATE TABLE categorysponsorsite (
categorysponsorsiteID INT PRIMARY KEY AUTO_INCREMENT,
sponsorsiteID INT NOT NULL,
categoryID INT NOT NULL
);
эта строчка не нужна совсем, зачем вести id для id лишнее место, лишняя нагрузка

0
 



С нами с 02.01.04
Сообщения: 1246
Рейтинг: 54

Ссылка на сообщениеДобавлено: 04/04/07 в 14:37       Ответить с цитатойцитата 

bleed писал:
ну если с запросом порешали от себя могу тока одно посоветовать:
CREATE TABLE categorysponsorsite (
categorysponsorsiteID INT PRIMARY KEY AUTO_INCREMENT,
sponsorsiteID INT NOT NULL,
categoryID INT NOT NULL
);
эта строчка не нужна совсем, зачем вести id для id лишнее место, лишняя нагрузка


Ну не знаю, а если удалить надо будет, по ай ди же.. ?

0
 



С нами с 19.02.03
Сообщения: 1284
Рейтинг: 354

Ссылка на сообщениеДобавлено: 04/04/07 в 19:33       Ответить с цитатойцитата 

а sponsorsiteID или categoryID, не id разве?icon_smile.gif
заметь у тебя categorysponsorsiteID в sql запросе не испаользовался, так же он и не будет использоваться при удалении

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »