Jeżeli ktoś jest zainteresowany optymalizacją zapytania to proszę o pomoc.
Co to jest?Baza providerów, operujących na terenie miast i poszczególnych ulic.
Dane:$province_id - identyfikator województwa
$provider_id - identyfikator dostawcy
Tablica miast (
cities) z polami:
- id - unikalny identyfikator miasta
- province_id - identyfikator województwa w którym się znajduje miasto
- name - nazwa miasta
- providers - lista id providerów dostarczających usługi na terenie całego miasta
- sub_providers - lista id providerów dostarczających usługi na terenie określonych w innej tabeli ulic danego miasta
Wynik zapytania:Dla podanego providera znaleźć miasta w których dostarcza on usługi.
Pola:
- id
- name
- provider - równe 1 jeśli dany provider jest na liście w polu cities.providers
- sub_provider - równe 1 jeśli provider jest na liście w polu cities.sub_providers
Miasta nie mogą się dublować - i tu mam problem - nie potrafię wyeliminować z poziomu MySQL duplikatów.
Zapytanie:Zmienna $regexp jest ustawiana następująco:
<?php
$regexp = \"^\" . $provider_id . \",|,\" . $provider_id . \",|,\" . $provider_id . \"$|^\" . $provider_id . \"$\";
?>
No i samo zapytanie
(
SELECT *, 1 AS provider, 0 AS sub_provider
FROM cities WHERE province_id=$province_id AND providers REGEXP '$regexp' AND sub_providers NOT REGEXP '$regexp'
)
UNION
(
SELECT *, 0 AS provider, 1 AS sub_provider
FROM cities WHERE province_id=$province_id AND providers NOT REGEXP '$regexp' AND sub_providers REGEXP '$regexp'
)
UNION
(
SELECT *, 1 AS provider, 1 AS sub_provider
FROM cities WHERE province_id=$province_id AND providers REGEXP '$regexp' AND sub_providers REGEXP '$regexp'
)
ORDER BY name
EDIT: Dołączam rozwiązanie w php
<?php
$regexp = \"^\" . $provider_id . \",|,\" . $provider_id . \",|,\" . $provider_id . \"$|^\" . $provider_id . \"$\";
$query =
\"(\" .
\"SELECT * \" .
\"FROM cities \" .
\"WHERE \" .
\"province_id=\" . $this->province_id . \" AND \" .
\"providers REGEXP '\" . $regexp . \"' \" .
\")\" .
\" UNION \" .
\"(\" .
\"SELECT * \" .
\"FROM cities \" .
\"WHERE \" .
\"province_id=\" . $this->province_id . \" AND \" .
\"sub_providers REGEXP '\" . $regexp . \"'\" .
\")\" .
\"ORDER BY name\";
if(in_array($provider_id, explode(\",\", $row[\"providers\"]))){ $row[\"city_provider\"] = TRUE; } else { $row[\"city_provider\"] = FALSE; }; if(in_array($provider_id, explode(\",\", $row[\"sub_providers\"]))){ $row[\"sub_provider\"] = TRUE; } else { $row[\"sub_provider\"] = FALSE; };
$items[] = $row;
};
?>
Ten post edytował ShaXbee 9.12.2004, 22:50:04