PHPDriver
2.11.2011, 16:56:39
Mam w bazie mySQL kolumnę z pewnymi ciągami liczb. Potrzebuję zapytania SQL, które zamieni je w poniższy sposób:
2 -> 1
2 -> 1
2 -> 1
3 -> 2
3 -> 2
7 -> 3
7 -> 3
7 -> 3
Jak to najprościej zrobić?
nospor
3.11.2011, 09:17:18
UPDATE tabela SET pole=IF(pole=2,1,IF(pole=3,2,IF(pole=7,3,pole))) ORDER BY pole ASC
Albo prostsze zapytanie, ale zakładające, że masz wyłącznie takie wartości - tj. 2, 3 i 7 - w tabeli:
UPDATE tabela SET pole = IF(pole = 7, 3, pole - 1)
PHPDriver
3.11.2011, 19:35:56
Dzięki, problem jest tylko taki, że to był tylko początek ciągu. Dalej są kolejne liczby i nie jestem w stanie ręcznie ich wpisać do zapytania. Chciałbym uzyskać jakieś uniwersalne zapytanie. Macie jeszcze jakieś pomysły?
A jak masz je zapisane w bazie i jak zapisujesz to na co chcesz je zmieniać?
PHPDriver
3.11.2011, 22:44:12
Ogólnie chcę, żeby wszystkie wartości zaczynały się od liczby 1 oraz żeby powtarzające się liczby miały tą samą wartość po zmianie.
A to było trzeba tak od razu!

$query = mysql_query('SELECT pole FROM tabela GROUP BY pole ORDER BY pole ASC'); mysql_query('UPDATE tabela SET pole = '.$i.' WHERE pole = '.$row['pole']); }
PHPDriver
4.11.2011, 21:52:05
Nieźle

A jak mam w drugiej tabeli te same numery pól (tylko pod inną nazwą) to też można je zmienić w tej kwerendzie, tak żeby pasowały?
tabela 1pole1
2 -> 1
2 -> 1
2 -> 1
3 -> 2
3 -> 2
7 -> 3
7 -> 3
7 -> 3
tabela 2pole2
2 -> 1
7 -> 3
Opierając się na tych przykładowych liczbach w drugiej tabeli może nie być np. liczby 3 i rekordy się nie powtarzają.
A tę pierwszą operację (w tabeli 1) zrobiłeś na jakiejś kopii albo w osobnej kolumnie? Bo jeśli nadpisałeś już dane, to nie ma jak nadpisać danych w tabeli 2 opierając się na poprzednich wartościach tabeli 1.
PHPDriver
4.11.2011, 22:50:09
Ćwiczę na kopii
To zrób sobie w pierwszej tabeli osobną kolumnę na te nowe liczby. Dzięki temu będziesz mógł przekopiować wyniki do drugiej. Jak będziesz miał gotowe i podasz mi nazwy pól i tabel to podam Ci zapytanie.
PHPDriver
4.11.2011, 23:04:23
Czyli taką tymczasową? Utworzyłem w tabeli1 kolumnę o nazwie pole3. Pozostałe pola/kolumny nazywają się tak jak w poprzednim przykładzie.
Powstawiałeś już do tej nowej kolumny wartości zgodnie z zapytaniem, które podałem wcześniej?
P.S. Nazywanie pól a'la pole1, pole2, pole35633 itp. to kiepski pomysł. One chyba coś oznaczają, prawda?
PHPDriver
4.11.2011, 23:48:08
Tzn to jest testowa baza. Ale to poprzednie zapytanie aktualizowało pole1 w tabeli1. Nie bardzo wiem po co nam kolejna kolumna i jakie wartości ma trzymać?
Przeczytaj moje poprzednie posty, wszystko Ci wytłumaczyłem.
PHPDriver
5.11.2011, 00:23:52
Cytat
To zrób sobie w pierwszej tabeli osobną kolumnę na te nowe liczby. Dzięki temu będziesz mógł przekopiować wyniki do drugiej. Jak będziesz miał gotowe i podasz mi nazwy pól i tabel to podam Ci zapytanie.
Nie rozumiem od tego miejsca

Jakbyś mi podał uniwersalną metodę, po prostu napisał co zrobić i dlaczego.
Mówisz, że masz dwie tabele. Chcesz zamienić w pierwszej pewne wartości na inne. Okej. Potem chcesz w drugiej tabeli pozamieniać wartości wg tego jak zostały zmienione w tabeli 1. PROBLEM: Jak pozamieniasz w pierwszej tabeli, to już ta druga nie ma się na czym oprzeć - nie wie z czego powstały te nowe liczby.'
Ale nieważne - jeżeli dane w tabeli 2 zawierają tylko liczby, które są też w tabeli 1, to może lepiej zrób od razu dla dwóch tabel w taki sposób:
$query = mysql_query('SELECT pole FROM tabela GROUP BY pole ORDER BY pole ASC'); mysql_query('UPDATE tabela1 SET pole = '.$i.' WHERE pole = '.$row['pole']); mysql_query('UPDATE tabela2 SET pole = '.$i.' WHERE pole = '.$row['pole']); }
PHPDriver
5.11.2011, 13:31:10
Niestety nadal mi to nie działa. Może podam tutaj mój konkretny przykład.
W tabeli
posty kolumna
poster_id ma być identyczna jak w tabeli
users kolumna
id.
Kolumna
id musi być przenumerowana (w tym przypadku od 1 do 72) i z nią wartości w kolumnie
poster_id.
Tutaj zrzut fragmentu bazy:
https://gist.github.com/1341451
A rozważałeś zastosowanie kluczy obcych z ON UPDATE CASCADE?
PHPDriver
5.11.2011, 18:34:22
Właśnie nie bardzo wiem jak to ugryźć...
W tabeli posty, poster_id powinien być kluczem obcym wskazującym na klucz podstawowy w tabeli users. Wykładu z kluczy obcych tu nie będę robił, po prostu poszukaj. To nie jest trudny temat.
PHPDriver
5.11.2011, 18:48:42
A dałoby się to jakoś obejść, żeby nie modyfikować struktury bazy?
Dałoby się, ale klucze obce to jest świetne narzędzie. Będziesz miał pewność zawsze, że dane są prawidłowo połączone. Przy ON UPDATE CASCADE, po zamianie ID w tabeli users, automatycznie zmienią się odwołania w tabeli posty. Wtedy nie ma szans na żadne błędy.
PHPDriver
5.11.2011, 19:33:20
Nie dałbyś się namówić, żeby na razie mi napisać to bez kluczy obcych, a ja z kluczy się doszkolę?
Jeśli wyślesz mi nazwy i struktury tych tabel i opiszesz o które pola chodzi, to wyślę Ci te zapytania.
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.