Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bug mysqla, czy mój błąd?
Forum PHP.pl > Forum > Bazy danych
L_Devil
Witam

Mam tabelę następującej struktury i treści:
Kod
+-------+---------+------------+-------------+
| id    |  owner  |    name    |    value    |
|int(15)| int(7)  |   char(40) |   char(40)  |
+-------+---------+------------+-------------+
|   1   |    1    |   points   |     75      |
|   2   |    1    | points_add |    150      |
|   3   |    1    | points_max |    5000     |
|   4   |    1    |  costam    | jakas_dana  |
|   5   |    2    |  points    |    250      |
|   6   |    2    | points_add |    150      |
|   7   |    2    | points_max |    5000     |
|   8   |    3    |  points    |    4900     |
|   9   |    3    | points_add |    250      |
|  10   |    3    | points_max |    5000     |
|  11   |    4    |  points    |    5500     |
|  12   |    4    | points_add |    250      |
|  13   |    4    | points_max |    5000     |
|  14   |    4    |  costam    | jakas_dana  |
+-------+---------+------------+-------------+


Wywołuję na niej zapytanie
  1. UPDATE
  2. TABLE AS t1,
  3. TABLE AS t2,
  4. TABLE AS t3
  5. SET t1.value =
  6. IF(t1.value > t2.value, t1.value,
  7. IF(t1.value+t3.value > t2.value, t2.value, t1.value+t3.value)
  8. )
  9. WHERE t2.owner = t1.owner AND t3.owner = t1.owner AND t1.name='points' AND t2.name='points_max' AND t3.name='points_add';



Spodziewany rezultat:
Kod
+-------+---------+------------+-------------+
| id    |  owner  |    name    |    value    |
|int(15)| int(7)  |   char(40) |   char(40)  |
+-------+---------+------------+-------------+
|   1   |    1    |   points   |     225     |
|   2   |    1    | points_add |    150      |
|   3   |    1    | points_max |    5000     |
|   4   |    1    |  costam    | jakas_dana  |
|   5   |    2    |  points    |    400      |
|   6   |    2    | points_add |    150      |
|   7   |    2    | points_max |    5000     |
|   8   |    3    |  points    |    5000     |
|   9   |    3    | points_add |    250      |
|  10   |    3    | points_max |    5000     |
|  11   |    4    |  points    |    5500     |
|  12   |    4    | points_add |    250      |
|  13   |    4    | points_max |    5000     |
|  14   |    4    |  costam    | jakas_dana  |
+-------+---------+------------+-------------+


Otrzymany rezultat:
Kod
+-------+---------+------------+-------------+
| id    |  owner  |    name    |    value    |
|int(15)| int(7)  |   char(40) |   char(40)  |
+-------+---------+------------+-------------+
|   1   |    1    |   points   |     75      |  // Tutaj nie podniosło
|   2   |    1    | points_add |    150      |
|   3   |    1    | points_max |    5000     |
|   4   |    1    |  costam    | jakas_dana  |
|   5   |    2    |  points    |    400      |
|   6   |    2    | points_add |    150      |
|   7   |    2    | points_max |    5000     |
|   8   |    3    |  points    |    5000     |
|   9   |    3    | points_add |    250      |
|  10   |    3    | points_max |    5000     |
|  11   |    4    |  points    |    5500     |
|  12   |    4    | points_add |    250      |
|  13   |    4    | points_max |    5000     |
|  14   |    4    |  costam    | jakas_dana  |
+-------+---------+------------+-------------+


Ktoś wie, skąd się takie coś bierze?
dr_bonzo
Ale dlaczego trzymasz liczby jako stringi (char)questionmark.gif
Nie wiem co w takim przypadku baza robi przy dodawaniu stringow, ale operacje na liczbach powinno wykonywac sie na liczbach.
Jaka to baza, MySQL?
(edit: Lol, siedzi w temacie smile.gif)
edit2:
1. czemu nie zrobisz 4 kolumn w tej tabeli dla points, points_add, points_max, costam?
2. gdy points > points_max to zapisujesz value = points; a wydaje mi sie ze points nie powinno przekraczac wartosci maksymalnej
L_Devil
Ze względu na to, że w tej tabeli przechowuję zarówno dane liczbowe jak i stringowe - a ponieważ utworzenie tabeli z kolumnami na to byłoby dość kłopotliwe (ciągłe dodawanie i usuwanie pól), więc jest jak jest winksmiley.jpg

Owner określa dla jakiego id użytkownika parametry są ważne

Zapytanie ma za zadanie:
a.) Wartości points mniejsze od points_max zwiększyć o points_add, tak, by nie przekroczyły points_max
b.) Wartości points większe bądź równe points_max zostawić niezmienione

blinksmiley.gif
dr_bonzo
Poprobuj z cast'em: http://mysql.com/doc/refman/5.0/en/cast-functions.html

A nie dostajesz zadnych bledow przy updacie? Sproboj wySELECTowac rekordy z uzyciem tego samego warunku WHERE.
L_Devil
Żadnego błędu. SELECT daje poprawne wyniki (wszystkie pola wybrane)
Cytat(dr_bonzo @ 7.08.2006, 13:15 ) *
1. czemu nie zrobisz 4 kolumn w tej tabeli dla points, points_add, points_max, costam?
ponieważ costam jest tylko przykładem i tych 'costamów' jest znacznie więcej i są dodawane w sposób nie ciągły (tzn. jedni go mają, inni nie mają, czasami dodają się w wyniku działań usera, itp. smile.gif )

Po zastosownaiu CAST-a problem zniknął. Teraz jestem w kropce - czy mam zgłaszać to jako bug do MYSQL AB? Przecież to zapytanie powinno się wykonać i bez CAST-a
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.