Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Сложный запрос в MySQL
Новая тема
Ответить
цитата
02/04/07 в 23:41
Proo
Наверно надо немного на другой форум, но все таки
Суть такая. Храню инфу о спонсорском сайте в двух таблицах. В первой общую инфу по сайту, напр:
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);
--
Извиняюсь если натупил, давно не программил
цитата
03/04/07 в 00:00
Stek
Цитата:
ategorysponsorsite.categoryID=8 AND categorysponsorsite.categoryID=2
замени на
Цитата:
ategorysponsorsite.categoryID=8 OR categorysponsorsite.categoryID=2
цитата
03/04/07 в 00:03
Proo
Stek писал:
замени на
Пробовал, вроде как не то.. выдает и тинов и азиаток, всего 20 напр выдает.. а нужно сайты которые азиатские тины только.. такой один..
Может еще кто сможет подсказать?
цитата
03/04/07 в 00:15
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;
Второй вариант сделать двойной джойн.
Код:
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);
Возможно написав хуню, но хотел помочь от чистого сердца
цитата
03/04/07 в 00:16
Stek
тогда тебе через 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)
цитата
03/04/07 в 06:56
leo1
А не проще ли использовать IN?
Типа
WHERE categorysponsorsite.categoryID IN ('8','2')
цитата
03/04/07 в 07:09
arachnO
leo1 писал:
Типа
WHERE categorysponsorsite.categoryID IN ('8','2')
это будет аналогом OR
а тут требуется немного другая выборка
как именно - в принципе Stek написал
у меня по крайней мере идей других нет
цитата
03/04/07 в 10:39
Proo
Спасибо всем за старание
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);
Возможно написав хуню, но хотел помочь от чистого сердца
Тута тоже ошибка
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
цитата
03/04/07 в 11:21
Stek
Код:
COUNT(*) cnt
неправильно, надо так
Код:
COUNT(*) AS cnt
, если я правильно понял что ты хочешь.
цитата
03/04/07 в 16:17
Proo
Всех оценил, спасибо! А вот и правильный ответ, коллеги
SELECT name,url FROM sponsorsite WHERE sponsorsiteID IN
(
SELECT sponsorsiteID
FROM categorysponsorsite WHERE categoryID IN(2,8)
GROUP BY sponsorsiteID
HAVING COUNT(categorysponsorsiteID) = 2
)
Тока не могу даже осмыслить запрос
П.с. иформировали меня о нем на соответсвующем форуме.
цитата
03/04/07 в 16:24
Stek
Уверен что правильный ?
HAVING COUNT(categorysponsorsiteID) = 2
выбирает из всех предъидущей выборки те сайты , которые принадлежать только двум! категориям.
Т.е. тины - азиатки - в нижнем белье : сюда уже не попадут. А должны, так как они тины - азиатки.
цитата
03/04/07 в 16:56
Proo
Знаешь вроде попадают.. например попал этнический сайт, который и эбони, и латина, и азиатки (и всего у сайта около 7 категорий).. вот, так что вроде все нормально, но я посмотрю, спасибо..
цитата
03/04/07 в 20:21
bleed
ну если с запросом порешали от себя могу тока одно посоветовать:
CREATE TABLE categorysponsorsite (
categorysponsorsiteID INT PRIMARY KEY AUTO_INCREMENT,
sponsorsiteID INT NOT NULL,
categoryID INT NOT NULL
);
эта строчка не нужна совсем, зачем вести id для id лишнее место, лишняя нагрузка
цитата
04/04/07 в 14:37
Proo
bleed писал:
ну если с запросом порешали от себя могу тока одно посоветовать:
CREATE TABLE categorysponsorsite (
categorysponsorsiteID INT PRIMARY KEY AUTO_INCREMENT,
sponsorsiteID INT NOT NULL,
categoryID INT NOT NULL
);
эта строчка не нужна совсем, зачем вести id для id лишнее место, лишняя нагрузка
Ну не знаю, а если удалить надо будет, по ай ди же.. ?
цитата
04/04/07 в 19:33
bleed
а sponsorsiteID или categoryID, не id разве?
заметь у тебя categorysponsorsiteID в sql запросе не испаользовался, так же он и не будет использоваться при удалении
Новая тема
Ответить
Эта страница в полной версии