Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie pobierające dane pod warunkiem że dany wpis nie występuje, czyli łączenie kolumn
ssstrz
post
Post #1





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

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


Witam tabela `deliv`:
  1. +-----------+--------+
  2. | idMessage | idUser |
  3. +-----------+--------+
  4. | 1 | 1 |
  5. | 42 | 1 |
  6. | 45 | 1 |
  7. | 45 | 2 |
  8. +-----------+--------+

po podaniu np: idMessage=42 oraz idUser=1 chcę otrzymać wynik:
  1. +-----------+--------+
  2. | idMessage | idUser |
  3. +-----------+--------+
  4. | 1 | 1 |
  5. | 45 | 1 |
  6. | 45 | 2 |
  7. +-----------+--------+


Ten post edytował ssstrz 12.04.2013, 11:13:41
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie kumam.... coś dodajesz a w tabeli chcesz miec rekordów....

Mówisz o jakimś zapytaniu czy jak?


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
matiit
post
Post #3





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Chcesz wszystkie rekordy ktore nie spelniają Twoich warunków czy jak?
Go to the top of the page
+Quote Post
ssstrz
post
Post #4





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

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


chodzi o zapytanie, (troche się zapętliłem z tym problemem):
zapytanie pobiera
  1. SELECT * FROM `deliv` WHERE `idMessage`=42 AND `idUser=`1`;

odrzuci wszystkie rekordy oprócz tego gdzie msg=42 i user=1 a ja chce na odwrót...

edit//
tutaj mam rozwiązanie co mniej więcej pokazuje jak działa (ale jest paskudne i nie chce takiego łączenia)
  1. SELECT * FROM (SELECT CONCAT_WS(' ',idMessage,idUser)AS co FROM `deliv`)cont WHERE cont.co<>'42 1';


Ten post edytował ssstrz 12.04.2013, 11:23:38
Go to the top of the page
+Quote Post
matiit
post
Post #5





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


  1. SELECT * FROM `deliv` WHERE `idMessage`<>42 OR `idUser`<>1;

To jest odwrotnośc, jak dobrze z logiki pamiętam,

Ale chyba bardziej chodzi Ci o:
  1. SELECT * FROM `deliv` WHERE `idMessage`<>42 AND `idUser`<>1;



Ten post edytował matiit 12.04.2013, 11:35:09
Go to the top of the page
+Quote Post
ssstrz
post
Post #6





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

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


Nie no pierwsze zapytanie jest dopowiedzią na mój temat, tylko że problem jest bardziej złożony i chciałem go jak najbardziej rozbić aby nie mieszać na from.
No ale napiszę, o co chodzi: mam tabelkę deliv i w niej rekordy
  1. +-----------+--------+
  2. | idMessage | idUser |
  3. +-----------+--------+
  4. | 1 | 1 |
  5. | 42 | 1 |
  6. | 45 | 1 |
  7. | 45 | 2 |
  8. +-----------+--------+

oraz pobraną już tabelkę `notif`
  1. +--------+-----------+------------+
  2. | idUser | idMessage | date |
  3. +--------+-----------+------------+
  4. | 1 | 45 | 2013-04-04 |
  5. | 2 | 45 | 2013-04-04 |
  6. | 4 | 45 | 2013-03-20 |
  7. | 5 | 45 | 2013-04-04 |
  8. | 6 | 45 | 2013-04-04 |
  9. | 7 | 45 | 2013-04-04 |
  10. | 8 | 45 | 2013-04-04 |
  11. | 9 | 45 | 2013-04-04 |
  12. | 10 | 45 | 2013-04-04 |
  13. | 11 | 45 | 2013-04-04 |
  14. | 14 | 45 | 2013-04-09 |
  15. +--------+-----------+------------+

Noi teraz szarpię się aby zapytanie zwróciło wszystkie rekordy z tabeli `notif` które nie występują w tabeli `deliv` (czyli ostatnia tabelka wszystkie rekordy od idUser=4 w dół), czy lepiej to zadanie przerzucić na php?
Go to the top of the page
+Quote Post
matiit
post
Post #7





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


  1. SELECT * FROM notif n INNER JOIN deliv d ON d.idUser <> n.idUser AND d.idMessage <> n.idMessage

Cos w ten deseń?
Go to the top of the page
+Quote Post
ssstrz
post
Post #8





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

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


No nie bardzo bo zapytanie zwraca notyfikacje (notif) już kiedyś wysłane (deliv).
http://sqlfiddle.com/#!2/74dbd/1
czyli jeśli w tabeli deliv występuje (1,2) to zapytanie nie powinno zwrócić 1,2. Dla usera 1 w przykładzie z linku powinno zwrócić 1,1, usera 2 pominąć, a dla usera 3 zwrócić 3,2
Go to the top of the page
+Quote Post
matiit
post
Post #9





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


  1. SELECT
  2. idUser, idMsg
  3. FROM
  4. notif n
  5. WHERE
  6. (n.idUser, n.idMsg)
  7. NOT IN
  8. (
  9. SELECT
  10. idUser, idMsg
  11. FROM
  12. deliv
  13. )

Niestety dopiero się uczę na poważnie SQLa i nie wiem jak jest z wydajnością tego.

Ale działa na pewno smile.gif

Ten post edytował matiit 12.04.2013, 13:45:05
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  1. SELECT * FROM `deliv` WHERE NOT (`idMessage`=42 AND `idUser=`1`);
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 Aktualny czas: 19.08.2025 - 18:42