Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Bug mysqla, czy mój błąd?, gdy w polu char(40) znajduje się liczba
L_Devil
post
Post #1





Grupa: Zarejestrowani
Postów: 195
Pomógł: 0
Dołączył: 13.04.2004
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Ale dlaczego trzymasz liczby jako stringi (char)(IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
L_Devil
post
Post #3





Grupa: Zarejestrowani
Postów: 195
Pomógł: 0
Dołączył: 13.04.2004
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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

(IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
L_Devil
post
Post #5





Grupa: Zarejestrowani
Postów: 195
Pomógł: 0
Dołączył: 13.04.2004
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Ż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. (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował L_Devil 7.08.2006, 12:58:28
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 10:43