Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zmiana numerów ciągu liczb
Forum PHP.pl > Forum > Bazy danych
PHPDriver
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
  1. UPDATE tabela SET pole=IF(pole=2,1,IF(pole=3,2,IF(pole=7,3,pole))) ORDER BY pole ASC
croc
Albo prostsze zapytanie, ale zakładające, że masz wyłącznie takie wartości - tj. 2, 3 i 7 - w tabeli:
  1. UPDATE tabela SET pole = IF(pole = 7, 3, pole - 1)
PHPDriver
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?
croc
A jak masz je zapisane w bazie i jak zapisujesz to na co chcesz je zmieniać?
PHPDriver
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.
croc
A to było trzeba tak od razu! smile.gif

  1. $query = mysql_query('SELECT pole FROM tabela GROUP BY pole ORDER BY pole ASC');
  2. for($i = 1; $row = mysql_fetch_assoc($query); ++$i) {
  3. mysql_query('UPDATE tabela SET pole = '.$i.' WHERE pole = '.$row['pole']);
  4. }
PHPDriver
Nieźle specool.gif
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 1
pole1
2 -> 1
2 -> 1
2 -> 1
3 -> 2
3 -> 2
7 -> 3
7 -> 3
7 -> 3

tabela 2
pole2
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ą.
croc
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
Ćwiczę na kopii smile.gif
croc
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
Czyli taką tymczasową? Utworzyłem w tabeli1 kolumnę o nazwie pole3. Pozostałe pola/kolumny nazywają się tak jak w poprzednim przykładzie.
croc
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
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ć?
croc
Przeczytaj moje poprzednie posty, wszystko Ci wytłumaczyłem.
PHPDriver
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 smile.gif Jakbyś mi podał uniwersalną metodę, po prostu napisał co zrobić i dlaczego.
croc
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:
  1. $query = mysql_query('SELECT pole FROM tabela GROUP BY pole ORDER BY pole ASC');
  2. for($i = 1; $row = mysql_fetch_assoc($query); ++$i) {
  3. mysql_query('UPDATE tabela1 SET pole = '.$i.' WHERE pole = '.$row['pole']);
  4. mysql_query('UPDATE tabela2 SET pole = '.$i.' WHERE pole = '.$row['pole']);
  5. }
PHPDriver
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
croc
A rozważałeś zastosowanie kluczy obcych z ON UPDATE CASCADE?
PHPDriver
Właśnie nie bardzo wiem jak to ugryźć...
croc
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
A dałoby się to jakoś obejść, żeby nie modyfikować struktury bazy?
croc
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
Nie dałbyś się namówić, żeby na razie mi napisać to bez kluczy obcych, a ja z kluczy się doszkolę? smile.gif
croc
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.