Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie pobierające dane pod warunkiem że dany wpis nie występuje
Forum PHP.pl > Forum > Bazy danych
ssstrz
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. +-----------+--------+
nospor
Nie kumam.... coś dodajesz a w tabeli chcesz miec rekordów....

Mówisz o jakimś zapytaniu czy jak?
matiit
Chcesz wszystkie rekordy ktore nie spelniają Twoich warunków czy jak?
ssstrz
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';
matiit
  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;

ssstrz
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?
matiit
  1. SELECT * FROM notif n INNER JOIN deliv d ON d.idUser <> n.idUser AND d.idMessage <> n.idMessage

Cos w ten deseń?
ssstrz
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
matiit
  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
mmmmmmm
  1. SELECT * FROM `deliv` WHERE NOT (`idMessage`=42 AND `idUser=`1`);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.