Konwersja SELECT Różne żądania OT. Postgresql przed MySQL

użyłem

PostgreSQL

, A teraz migrują

MySQL

.

W moich prośbach używam

PostgreSQL

' s
SELECT DISTINCT ON /col1, col2, col3/

, Zastanawiałem się, czy nie było jakieś analogowe tego oświadczenia

MySQL

.
Zaproszony:

Mieczysław

Potwierdzenie od:

Brak dokładnego odpowiednika konwersji żądania Postgresql, który używa SELECT DISTINCT ON w MySQL.

Postgresql SELECT Wyraźnie włącznie

.

W Postgresql Poniższy wniosek usunie wszystkie linie, w których wyrażenia
/col1, col2, col3/

pokrywa się i utrzymuje tylko "first col4, col5 row" Dla każdego zestawu dopasowanych strun:


SELECT DISTINCT ON /col1, col2, col3/ col4, col5
FROM tablename


Więc jeśli twój stół to:


col1 | col2 | col3 | col4 | col5
--------------------------------
1 | 2 | 3 | 777 | 888
1 | 2 | 3 | 888 | 999
3 | 3 | 3 | 555 | 555


Nasza prośba zapisz tylko jedną linię /1,2,3/ i jedna linia /3,3,3/. Następnie wynikowe linie będą:


col4 | col5
-----------
777 | 888
555 | 555


Proszę to zanotować "first row" Każdy zestaw jest nieprzewidywalny, nasz pierwszy wiersz może być /888, 999/, Jeśli nie określamy zamówienia przez:


SELECT DISTINCT ON /col1, col2, col3/ col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4


/wyrażenie DISTINCT on musi odpowiadać najwcześniejszym kolejności wyrażeń BY, Ale zamówienie BY może zawierać dodatkowe wyrażenia/.

MySQL Ekspansja do GROUP BY

MySQL Rozszerza się
http://dev.mysql.com/doc/refma ... .html
, więc możemy select Niezrównane kolumny niewymienione we wniosku GROUP BY. Za każdym razem, gdy używamy innych diagnozowanych kolumn, serwer może swobodnie wybrać dowolną wartość z każdej grupy z tej kolumny, więc wynikowe wartości będą niepewne.

Więc to prośba Postgresql:


SELECT DISTINCT ON /col1, col2, col3/ col4, col5
FROM tablename


można uznać za równoważny z tym żądaniem MySQL:


SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3


i Postgresql, i MySQL Powrót "First row" dla każdego /col1, col2, col3/, W obu przypadkach zwrócona linia jest nieprzewidywalna, ponieważ nie wskazaliśmy i nie usprawniliśmy oferty.

Wiele osób byłoby bardzo podatne na przekształcenie tego żądania. Postgresql przez ORDER BY:


SELECT DISTINCT ON /col1, col2, col3/ col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4


z tym:


SELECT col4, col5
FROM /
SELECT col1, col2, col3, col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
/ s
GROUP BY col1, col2, col3


Pomysł ma zastosowanie ORDER BY do podzapytania, aby podczas grupowania MySQL przez col1, col2, col3 Utrzymywał pierwszą wartość spotkania col4 i col5.

Pomysł jest dobry, ale błędny!

MySQL może swobodnie wybrać dowolną wartość dla col4 i col5, I nie wiemy, które z nich są po pierwsze, zależy to od optymalizatora. Dlatego naprawiłbym to tak:


SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN /SELECT col1, col2, col3, MIN/col4/ as m_col4
FROM tablename
GROUP BY col1, col2, col3/ s
ON t1.col1=s.col1
AND t1.col2=s.col2
AND t1.col3=s.col3
AND t1.col4=s.m_col4
GROUP BY
t1.col1, t1.col2, t1.col3, t1.col4


Ale staje się coraz bardziej trudniejsze.

Wynik

Z reguły nie ma dokładnego sposobu konwersji żądania Postgresql cieszący się popytem MySQL, Ale istnieje wiele utworów obejściowych, wynikający z tego wniosek może być tak prosty jak oryginał, lub może stać się bardzo trudny, ale zależy od samego żądania.

Leszek

Potwierdzenie od:

Użyj podzapytania do określania zamówienia i zewnętrznego żądania, aby je grupować.

Jak wskazano @a_horse_with_no_name, Działa dlatego MySQL Pozwala częściowe
group by

, W przeciwieństwie do innych DBMSs.

Na przykład:


CREATE TABLE customer_order
/`customer` varchar/5/, `item` varchar/6/, `date` datetime/
;

INSERT INTO customer_order
/`customer`, `item`, `date`/
VALUES
/'alice', 'widget', '2000-01-05 00:00:00'/,
/'bob', 'widget', '2000-01-02 00:00:00'/,
/'alice', 'widget', '2000-01-01 00:00:00'/,
/'alice', 'wodget', '2000-01-06 00:00:00'/
;


Wniosek o pierwsze zamówienie każdego klienta:


select *
from
/select customer, item, date
from customer_order
order by date/ c
group by customer


Wynik:


| CUSTOMER | ITEM | DATE |
|----------|--------|--------------------------------|
| alice | widget | January, 01 2000 00:00:00+0000 |
| bob | widget | January, 02 2000 00:00:00+0000 |


[/url]

Józef

Potwierdzenie od:

Nie możesz select Różne wartości kilku kolumn. Po wybraniu użycia żądania w następujący sposób.


select distinct col1, col2 from table

Artur

Potwierdzenie od:

Musisz iść

PDO

lub

MSYQLI

zamiast

MYSQL

, Ponieważ jest już przestarzały.

Możesz zrobić o swoim pytaniu


SELECT DISTINCT col1, col2, col3


lub


SELECT col1, col2, col3
........

GROUP BY col1 --//--- or whatever column you want to be distinct

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się