Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównywanie wierszy w tabeli pod kątem różnic między polami

Każde wyrażenie w SQL musi odwoływać się do kolumn tylko w jednym wierszu (z wyłączeniem podzapytań).

JOIN może być użyty do utworzenia dwóch różnych wierszy w jednym wierszu zestawu wyników.

Możesz więc porównać wartości w różnych wierszach, wykonując samosprzężenie. Oto przykład, który pokazuje łączenie każdego wiersza z każdym innym wierszem powiązanym z tym samym klientem (z wyłączeniem łączenia wiersza z samym sobą):

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)

Teraz możesz pisać wyrażenia porównujące kolumny. Na przykład, aby ograniczyć powyższe zapytanie do tych, w których pole 1 jest różne:

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;

Nie określasz, jakich porównań musisz dokonać, więc zostawiam to Tobie. Kluczową kwestią jest to, że ogólnie możesz użyć sprzężenia samodzielnego do porównania wierszy w danej tabeli.

Odnieś się do twoich komentarzy i wyjaśnień:OK, więc twoja „różnica” nie jest po prostu wartością, ale porządkową pozycją rzędu. Pamiętaj, że relacyjne bazy danych nie mają pojęcia o numerze wierszy, mają tylko kolejność wierszy w odniesieniu do jakiejś kolejności, którą musisz określić w ORDER BY klauzula. Nie myl „id " pseudoklucz z numerem wiersza, numery są przypisywane jako monotonicznie rosnące tylko przez zbieg ich realizacji.

W MySQL możesz skorzystać ze zmiennych zdefiniowanych przez użytkownika aby osiągnąć pożądany efekt. Zamów zapytanie według clientId a następnie przez id i śledź wartości na kolumnę w zmiennych użytkownika MySQL. Gdy wartość w bieżącym wierszu różni się od wartości w zmiennej, zrób to, co chcesz podświetlić. Pokażę przykład dla jednego pola:

SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
  IF(@clientid <> clientid, 
    ((@clientid := clientid) AND (@field1 := field1)) = NULL,
    IF (@field1 <> field1, 
      (@field1 := field1), 
      NULL
    )
  ) AS field1_changed
FROM client c
ORDER BY clientId, id;

Zauważ, że to rozwiązanie nie różni się tak naprawdę od wybrania wszystkich wierszy za pomocą zwykłego SQL i śledzenia wartości za pomocą zmiennych aplikacji podczas pobierania wierszy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql AVG, aby zignorować zero

  2. Niezdefiniowana właściwość:Illuminate\Database\Eloquent\Collection::Laravel 5.2

  3. Jak mogę policzyć użytkowników online w mojej aplikacji?

  4. ekwiwalent concat grupy w świni?

  5. Jak pobrać kolejną pozycję na liście rekordów MySQL?