Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2017-12-20, 21:57


KacperCL







Wiek: 26
Na forum: 5408 dni
Posty: 15
Nick w MP: [FS]Kacper[C]



Respekt: 60

Witam.

Mamy 3 tabele: gangs, zones, zones_gangscore.

Struktura tabeli gangs:

Kod:


CREATE TABLE `gangs` (
`id` smallint(1) UNSIGNED NOT NULL,
`color` char(6) NOT NULL DEFAULT '000000'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE `gangs`
ADD PRIMARY KEY (`id`);


Struktura tabeli zones:

Kod:

CREATE TABLE `zones` (
`id` int(10) UNSIGNED NOT NULL,
`miny` double NOT NULL,
`minx` double NOT NULL,
`maxy` double NOT NULL,
`maxx` double NOT NULL,
`active` tinyint(3) UNSIGNED NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `zones`
ADD PRIMARY KEY (`id`);


Struktura tabeli zones_gangscore
Kod:


CREATE TABLE `zones_gangscore` (
`id_zone` int(10) UNSIGNED NOT NULL,
`id_gang` smallint(5) UNSIGNED NOT NULL,
`respect` int(10) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `zones_gangscore`
ADD PRIMARY KEY (`id_zone`,`id_gang`),
ADD KEY `respect` (`respect`);


W gangs mamy przyk?adowe 2 gangi:
ID=1, color FFFFFF
ID=2 color FFFF00

W zones mamy przyk?adow? stref?:
id= 34 miny=1785.03 minx=-2259.5 maxy=1981.03 maxx=2063.5 active=1

W zones_gangscore, tabeli kt?ra odpowiada za "respekt" dzielnicy. Gangi zdobywaj? dzielnic?, poprzez przebywanie na niej. Jedna minuta przebywania na dzielnicy powoduje zwi?kszenie respektu o 1. Przyk?adowo Gang 1 przebywa na dzielnicy 10 minut, ma 10 respektu. Gang 2 przebywa 5 minut, ma 5 respektu. Przyk?ad w zones_gangscore
id_zone=34 id_gang=2 respect=5
id_zone=34 id_gang=1 respect=10

Mamy zapytanie SQL:
Kod:

SELECT * FROM (select z.id,z.miny,z.minx,z.maxy,z.maxx,IFNULL(g.color,'909090') from zones z LEFT JOIN zones_gangscore zgs ON zgs.id_zone=z.id LEFT JOIN gangs g ON g.id=zgs.id_gang WHERE z.active=1 ORDER BY zgs.respect DESC) s1 GROUP BY id LIMIT 60;


Zwraca:
Kod:

id miny minx maxy maxx IFNULL(g.color,'909090')
34 1785.03 -2259.5 1981.03 -2063.5 FFFF00


Zapytanie ma pobra? dzielnice gangowe oraz gang, kt?ry w tej dzielnicy "zarobi?" najwi?cej respektu. Jak pisa?em wy?ej, Gang 1 (kolor #FFFFFF) ma 10 respektu, a gang 2 (kolor #FFFF00) ma 5 respektu. S?k w tym, ?e mimo sortowania od najwi?kszej liczby respektu (ORDER BY zgs.respect DESC), bierze ten gang, kt?ry ma najmniej respektu.

Oczekiwany wynik:
Kod:

id miny minx maxy maxx IFNULL(g.color,'909090')
34 1785.03 -2259.5 1981.03 -2063.5 FFFFFF


Ostatnio zmieniony przez KacperCL 2017-12-21, 18:31, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-20, 22:52


Combacior







Wiek: 29
Na forum: 5795 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
U?y?em dok?adnie takie samo zapytanie jak poda?e?, zwr?ci?o mi dobry wynik (gang 1). ?eby si? upewni?, ?e wybiera gang 1, doda?em dodatkowo do zapytania ID gangu

Kod:

SELECT * FROM (select z.id,z.miny,z.minx,z.maxy,z.maxx,IFNULL(g.color,'909090'),zgs.id_gang from zones z LEFT JOIN zones_gangscore zgs ON zgs.id_zone=z.id LEFT JOIN gangs g ON g.id=zgs.id_gang WHERE z.active=1 ORDER BY zgs.respect DESC) s1 GROUP BY id LIMIT 60;


Wynik

Kod:

34 1785.03 -2259.5 1981.03 2063.5 FFFFFF 1


Ostatnio zmieniony przez Combacior 2017-12-22, 12:09, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-21, 17:56


KacperCL







Wiek: 26
Na forum: 5408 dni
Posty: 15
Nick w MP: [FS]Kacper[C]



Respekt: 60

Ciekawe, testowa?em na kilku bazach danych (ServerProject, serwer na XAMPP, nginx)

Zapytanie:
Kod:

-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Czas generowania: 21 Gru 2017, 17:24
-- Wersja serwera: 10.1.19-MariaDB
-- Wersja PHP: 5.6.28

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `gangs`
--

CREATE TABLE `gangs` (
`id` smallint(1) UNSIGNED NOT NULL,
`color` char(6) CHARACTER SET utf8 NOT NULL DEFAULT '000000'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Zrzut danych tabeli `gangs`
--

INSERT INTO `gangs` (`id`, `color`) VALUES
(1, '111111'),
(2, '222222');

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `zones`
--

CREATE TABLE `zones` (
`id` int(10) UNSIGNED NOT NULL,
`miny` double NOT NULL,
`minx` double NOT NULL,
`maxy` double NOT NULL,
`maxx` double NOT NULL,
`active` tinyint(3) UNSIGNED NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Zrzut danych tabeli `zones`
--

INSERT INTO `zones` (`id`, `miny`, `minx`, `maxy`, `maxx`, `active`) VALUES
(1, 111.111, 111.111, 111.111, 111.111, 1);

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `zones_gangscore`
--

CREATE TABLE `zones_gangscore` (
`id_zone` int(10) UNSIGNED NOT NULL,
`id_gang` smallint(5) UNSIGNED NOT NULL,
`respect` int(10) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Zrzut danych tabeli `zones_gangscore`
--

INSERT INTO `zones_gangscore` (`id_zone`, `id_gang`, `respect`) VALUES
(1, 2, 100),
(1, 1, 5);

--
-- Indeksy dla zrzut?w tabel
--

--
-- Indexes for table `gangs`
--
ALTER TABLE `gangs`
ADD PRIMARY KEY (`id`);

--
-- Indexes for table `zones`
--
ALTER TABLE `zones`
ADD PRIMARY KEY (`id`);

--
-- Indexes for table `zones_gangscore`
--
ALTER TABLE `zones_gangscore`
ADD PRIMARY KEY (`id_zone`,`id_gang`),
ADD KEY `respect` (`respect`);


Dalej pokazuje, ?e gang 1 jest najsilniejszym gangiem na dzielnicy 1 (mimo, i? gang 2 ma 100 respektu, a gang 1 ma tylko 5).

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-22, 12:10


Combacior







Wiek: 29
Na forum: 5795 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Faktycznie, u mnie na localhoscie zapytanie zwraca dobry wynik (WAMP, MySQL 5.6.17) a sprawdzi?em na bazie danych od liveserver, to zwraca inaczej. To powinno dzia?a?

Kod:

SELECT id, minx, miny, maxx, maxy, IFNULL((SELECT id_gang FROM zones_gangscore zgs WHERE z.id = zgs.id_zone ORDER BY respect DESC LIMIT 1), -1) FROM zones z


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-22, 13:39


KacperCL







Wiek: 26
Na forum: 5408 dni
Posty: 15
Nick w MP: [FS]Kacper[C]



Respekt: 60

A jakby jeszcze do??czy? kolor gangu, kt?ry ma najwi?ksz? ilo?? respektu na dzielnicy?
Kod:

IFNULL(g.color,'909090') FROM gangs g


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-23, 16:59


Combacior







Wiek: 29
Na forum: 5795 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Nie jestem tutaj od dawania gotowych rozwi?za?, tylko od pomocy. Spr?buj najpierw samemu, jak si? nie uda, to pomog?.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-23, 21:29


KacperCL







Wiek: 26
Na forum: 5408 dni
Posty: 15
Nick w MP: [FS]Kacper[C]



Respekt: 60

Aj, bym zapomnia?. Po?pieszy?em si?.
Zmieni?em nazw? kolumny id w tabeli zones na zid, bo si? p??niej to gryz?o z tabel? gangs (tam te? mamy id).

Kod:

SELECT zid, minx, miny, maxx, maxy,
(SELECT id_gang FROM zones_gangscore zgs WHERE z.zid = zgs.id_zone ORDER BY zgs.respect DESC LIMIT 1),
(SELECT IFNULL(color,'909090') FROM gangs g JOIN zones_gangscore zgs ON g.id=zgs.id_gang LIMIT 1)
FROM zones z,zones_gangscore zgs WHERE z.active=1 GROUP BY zid ORDER BY zid LIMIT 56


Pokazuje tylko 1 kolor - FFFFFF, id gangu poprawne

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-24, 10:45


Combacior







Wiek: 29
Na forum: 5795 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Je?li s? dwie kolumny o takich samych nazwach w r??nych tabelach, to wystarczy da? nazw? tabeli albo alias przed nazw? kolumny (nazwa_tabeli.nazwa_kolumny), znasz to u?ycie, bo go u?ywasz w niekt?rych zapytaniach. Og?lnie z tego co widz?, to strasznie kombinujesz - ograniczasz si? do u?ywania LEFT JOIN ... ON. Mog? zrozumie?, ?e tylko to znasz, ale wystarczy poszuka? w google. Opr?cz LEFT JOIN jest tak?e RIGHT JOIN, OUTER JOIN, STRAIGHT_JOIN a tak?e INNER_JOIN, kt?rego ja u?y?em, aby do??czy? kolor gangu. Tak samo nie wszystkie zapytania JOIN musz? zawiera? klauzul? ON, bo jest tak?e klauzula HAVING.

Kod:

SELECT z.id, minx, miny, maxx, maxy, (SELECT id_gang FROM zones_gangscore zgs WHERE z.id = zgs.id_zone ORDER BY respect DESC LIMIT 1) id_gang, g.color, g.id FROM zones z INNER JOIN gangs g HAVING id_gang = g.id


Zapytanie to ju? mia?em gotowe jak pisa?em poprzedni post, ale chcia?em zobaczy? czy chocia? sam pr?bowa?e? to zrobi? czy czeka? na gotowe.

Postaw piwo autorowi tego posta
 

 
Tagi: [mysql] :: pobieranie :: dzielnic :: gangowych :: respektu
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » PAWN » [MYSQL] Pobieranie dzielnic gangowych i respektu Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku