'What's wrong with my MYSQL Code query in php file?
I have two tables in mysql database
one table named is place:
| place_id | place | active | shortform | country | type |
|---|---|---|---|---|---|
| 1 | Uttar Pradesh | 1 | UP | India | State |
| 2 | Delhi | 1 | DELHI | India | Union territory |
| 3 | Punjab | 1 | PUN | India | State |
| 4 | Karnataka | 1 | KAR | India | State |
| 5 | Kerala | 1 | KER | India | State |
| 6 | Lucknow | 1 | LKO | India | Capital |
| 7 | Chandigarh | 1 | CHA | India | Capital |
| 8 | Bengaluru | 1 | BEN | India | Capital |
| 9 | Thiruvanthapuram | 1 | THI | India | Capital |
| 10 | Saharanpur | 1 | SAH | India | District |
| 11 | Meerut | 1 | MEE | India | District |
| 12 | Gorakhpur | 1 | GOR | India | District |
and other named as place_capital
| id_place_place | place_parent | place_child |
|---|---|---|
| 1 | 1 | 6 |
| 2 | 3 | 7 |
| 3 | 4 | 8 |
| 4 | 5 | 9 |
| 5 | 1 | 10 |
| 6 | 1 | 11 |
| 7 | 1 | 12 |
I run this query
select *, group_concat(place_capital.place_child) AS Group from place
left join place_capital on place.place_id = place_place.place_parent
where place.place_id = place_place.place_parent and active = :active AND type = :type
group by place ORDER BY place
and it give the following result
| place_id | place | active | shortform | country | type | id_place_place | place_parent | place_child | Group |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Uttar Pradesh | 1 | UP | India | State | 1 | 1 | 6 | 6,10,11,12 |
| 3 | Punjab | 1 | PUN | India | State | 2 | 3 | 7 | NULL |
| 4 | Karnataka | 1 | KAR | India | State | 3 | 4 | 8 | NULL |
| 5 | Kerala | 1 | KER | India | State | 4 | 5 | 9 | NULL |
What query I used in php file to give the following result that include Delhi also. The place table have some relationship with place_place table. with my above sql query that not give the Delhi in the result. So, what is the thing I missed in the php file to get the below result.
| place_id | place | active | shortform | country | type | id_place_place | place_parent | place_child | Group |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Uttar Pradesh | 1 | UP | India | State | 1 | 1 | 6 | 6,10,11,12 |
| 2 | Delhi | 1 | DELHI | India | Union Territory | NULL | NULL | NULL | NULL |
| 3 | Punjab | 1 | PUN | India | State | 2 | 3 | 7 | NULL |
| 4 | Karnataka | 1 | KAR | India | State | 3 | 4 | 8 | NULL |
| 5 | Kerala | 1 | KER | India | State | 4 | 5 | 9 | NULL |
and here is the code in the php file:-
public function __construct(Querier $db, $type = "", $active = 1) {
$this->db = $db;
$this->type = $type;
$this->active = $active;
$connection = $this->db->getConnection();
if ($this->type != "") {
$statement = $connection->prepare("select *, group_concat(place_capital.place_child) AS Group from place
left join place_capital on place.place_id = place_place.place_parent
where place.place_id = place_place.place_parent and active = :active AND type = :type
group by place ORDER BY place ");
$statement->bindParam(":type", $this->type);
} else {
$statement = $connection->prepare("SELECT * FROM place WHERE active = :active ORDER BY place ");
}
$statement->bindParam(":active", $this->active);
$statement->execute();
$this->_guide_list = $statement->fetchAll();
}
Solution 1:[1]
As I can see here you only filter based on state and Delhi is Union Territory so to include that in a list you need to use In operator to filter type. you can also skip a join condition from where clause.
SELECT *,
Group_concat(place_capital.place_child) AS Group
FROM place
left join place_capital
ON place.place_id = place_capital.place_parent
WHERE active = 1
AND TYPE IN ('State', 'Union Territory')
GROUP BY place.place_id
ORDER BY place.place_id
Solution 2:[2]
If you want to achieve this in production, I would recommend using mature API gateways like Apache APISIX or Kong. To implement it yourself, maybe you could store paths with wildcard or Lua patterns in Redis to allow later matching to the original URI. Applying some simple heuristics would help reduce the range of checking.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Alexander Misel |
