2017-06-19 16 views
7

Jak określić pole WYNIKI w użytkownikach tabel, w oparciu o pole WYNIK UŻYTKOWNIKA z ustawieniami o wartości najbliższej polu SCORE MARKA.Jak znaleźć najbliższą wartość w PHP

enter image description here

Jest to tabela Marka

<table> 
<tr> 
<th>BRAND NAME</th> 
<th>SCORE BRAND</th> 
</tr>"; 
$sql = mysql_query("SELECT * FROM brand"); 
while($m=mysql_fetch_array($sql)){ 
echo "<tr> 
<td>$m[brand_name]</td> 
<td>$m[score]</td><tr>"; 
} 
</table> 

To użytkownicy stół

<table> 
<tr> 
<th>USER NAME</th> 
<th>SCORE USER</th> 
<th>RESULT</th> 
</tr>"; 
$sql2 = mysql_query("SELECT * FROM users"); 
while($u=mysql_fetch_array($sql2)){ 
echo "<tr> 
<td>$u[username]</td> 
<td>$u[score]</td> 
<td> ??? </td> 
<tr>"; 
} 
</table> 
+0

Co próbowałeś do tej pory? –

+0

Co, jeśli użytkownik ma wynik "55" - jaki jest pożądany wynik? 'Axa' lub' Autocilin'? –

+0

im po prostu spróbuj z warunkiem else, ale nie działa. 55 powinno być autocilin. –

Odpowiedz

0
select * 
from table 
order by abs(value - $myvalue) 
limit 1 
+1

Czy możesz opisać zmienną $ myvalue? –

+0

$ myvalue byłby wynikiem, na który się patrzysz - w rezultacie 1 zapytanie za markę - odpowiedź Romana Hocke'a robi to samo, ale w 1 ogólnym zapytaniu –

0

Trzeba mieć jakiś predefiniowany próg pasujące do około (tak, że punktacja 1 nie pasowałoby do wyniku 1000).

SELECT .. WHERE score_brand >= score_user - :epsilon AND score_brand <= score_user + :epsilon 
+0

nie ma predefiniowanego progu, jego podobna podstawa do diagnozy opiera się na marce –

0

Wreszcie mam jakieś ładne rozwiązanie:

SELECT u.*, b.nama_lengkap as result 
FROM `users` AS u 
JOIN `brands` AS b 
WHERE (b.score - u.score) > 0 
AND (b.score - u.score) < 10 
ORDER BY u.id; 

b.nama_lengkap -> nazwa marki

Właśnie dołączył dwie tabele i zrobił kilka operacji arytmetycznej, aby uzyskać odpowiedni wiersz .

EDIT

SELECT v.id, v.username, v.score, b.nama_lengkap AS result 
FROM (SELECT users.id, users.score, users.username, min(brands.score) nextSc 
     FROM users 
     LEFT JOIN brands 
     ON users.score <= brands.score 
    GROUP BY users.id, users.score) AS v 
LEFT JOIN brands b 
    ON v.nextSc = b.score 
ORDER BY v.id, v.score; 

Ta pełna dynamicznych zapytań dla jakichkolwiek wartości multiplicated. Otrzymasz wynik zamknięcia marek dla użytkowników.

można znaleźć LIVE DEMO HERE

+0

czekaj ... próbuję ... –

+0

@SigitPrasetya, Co się stało? czy moje zapytanie nie działa? –

+0

to działa ... Ale tylko dla wielokrotności 10. Jak o wielokrotnościach 2,3, ... i więcej niż 10 –

3

Można użyć podzapytania w selekcji, aby znaleźć właściwą markę dla każdego wybranego użytkownika tak:

SELECT u.*, (
    SELECT b.id 
    FROM brand AS b 
    ORDER BY ABS(b.score - u.score) ASC, b.score DESC -- selects brands ordered by their difference from user's score 
    LIMIT 1 -- get just the first brand (with score closest to user's) 
) 
FROM user AS u 
Powiązane problemy