Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] LIKE i AND
parzol
post 27.08.2008, 23:37:44
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


Witam,

Mam tabelę 'property' (id, name, cos, cos2) oraz 'attraction' (id, name). Łączy je tabela 'property_attraction' (property_id, attraction_id). Potrzebuję zbudować zapytanie SQL`a, które pobiera pewne dane z tabeli 'property' z klauzulą WHERE w której podane są id atrakcji.

Gdy dam WHERE pa.attraction_id=1 OR pa.attraction_id=2 to pokazuje mi property (co logiczne) z conajmniej jedną z tych dwóch atrakcji. Gdy zamiast OR dam AND dostaję "EMPTY SET".

Jak zbudować więc to zapytanie aby otrzymać te property które mają atrakcje o id 1 i 2 ? sciana.gif
Go to the top of the page
+Quote Post
jarrod
post 28.08.2008, 02:00:30
Post #2





Grupa: Zarejestrowani
Postów: 312
Pomógł: 9
Dołączył: 14.10.2006
Skąd: warszawa

Ostrzeżenie: (0%)
-----


Ja bym to zrobił tak:
  1. SELECT property.* FROM `property` JOIN `property_attraction` ON `property_attraction`.`attraction_id` = `property`.`id`
  2. WHERE `property_attraction`.`attraction_id` = [id atrakcji 1] OR `property_attraction`.`attraction_id` = [id atrakcji 2]

Ale łatwiej by było jakbyś wkleił swoje zapytanie.
Go to the top of the page
+Quote Post
skowron-line
post 28.08.2008, 08:30:16
Post #3





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


Cytat
Gdy dam WHERE pa.attraction_id=1 OR pa.attraction_id=2 to pokazuje mi property (co logiczne) z conajmniej jedną z tych dwóch atrakcji. Gdy zamiast OR dam AND dostaję "EMPTY SET".

Kod
pa.attraction_id=1
pa.attraction_id=2


To są takie same pola więc nie dziw się że kllauzula AND nie działa. Bo jak jedno pole może przyjąć na raz 2 wartości

Możesz użyć IN
Kod
WHERE pa.attraction.id IN ( 1, 2 )


Ten post edytował skowron-line 28.08.2008, 08:34:31


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
nevt
post 28.08.2008, 09:11:56
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


To będzie coś w rodzaju:
  1. SELECT `property`.* FROM `property` LEFT JOIN `property_attraction` ON `property`.`id` = `property_attraction`.`property_id` WHERE `attraction_id` IN (value_1, value_2) GROUP BY `property`.`id` HAVING COUNT(`attraction_id`) = 2;


Powodzenia.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
parzol
post 28.08.2008, 12:28:09
Post #5





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


Cytat(nevt @ 28.08.2008, 08:11:56 ) *
To będzie coś w rodzaju:
  1. SELECT `property`.* FROM `property` LEFT JOIN `property_attraction` ON `property`.`id` = `property_attraction`.`property_id` WHERE `attraction_id` IN (value_1, value_2) GROUP BY `property`.`id` HAVING COUNT(`attraction_id`) = 2;


Samo w sobie to działa. Ale po dołączeniu do mojego zapytania SQL dalej wyrzuca Empty Set.

O to moje zapytanie:

  1. SELECT r.id AS room_id, r.name AS room_name, p.id AS property_id, p.name AS property_name, c.name AS city, region.name AS region, p.standard, rg.file, MIN(rp.price) AS min_price, MAX(rp.price) AS max_price,
  2. GROUP_CONCAT(DISTINCT CONCAT(a.name, '*', a.icon) ORDER BY a.name SEPARATOR '|') AS attractions, r.description AS opis, r.bedroom_number AS l_sypialni, r.room_number AS l_pokoi, GROUP_CONCAT(DISTINCT CONCAT(t.name) ORDER BY t.name SEPARATOR '|') AS typ, r.is_apartment AS apartament
  3. FROM room r LEFT JOIN property p ON r.property_id=p.id
  4. LEFT JOIN room_gallery rg ON rg.room_id=r.id
  5. LEFT JOIN room_price rp ON rp.room_id=r.id
  6. LEFT JOIN region ON p.region_id=region.id
  7. LEFT JOIN city c ON p.city_id=c.id
  8. LEFT JOIN property_attraction pa ON p.id=pa.property_id
  9. LEFT OUTER JOIN attraction a ON pa.attraction_id=a.id AND (a.is_active=1 OR a.is_active IS NULL)
  10. LEFT JOIN property_category pc ON p.id=pc.property_id
  11. LEFT JOIN room_type rt ON rt.room_id=r.id
  12. LEFT OUTER JOIN type t ON rt.type_id=t.id AND (t.is_active=1 OR t.is_active IS NULL)
  13. WHERE pa.attraction_id IN(3,9) GROUP BY r.id HAVING COUNT(pa.attraction_id)=2 ORDER BY p.is_promoted DESC LIMIT 0, 51;


Jakiś pomysł? Wskazówka?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 00:54