[英]How to combine results of two query from different tables?
我有两张桌子:
表店:
字段:id, shopname, address, area_name, contact
表_城市:
字段:id、area_name(同table_shop)、city
两个表中的公共字段:area_name
现在我想使用 area_name 和城市搜索商店。 如果可用数据较少,则优先级为 area_name,然后按城市获取。
例如看到这个。
我想获取特定区域(例如“河滨”)的移动商店的 3 条记录,但这里只有 1 条记录可用,但我需要 3 条,所以剩下的 2 条记录来自艾哈迈达巴德当地的河滨城市。 所以我需要从艾哈迈达巴德的车站路获取下两条记录。
我试着做这两个不同的查询,如下所示,
$q1=mysql_fetch_array(mysql_query("select * from Table_Shop where area_name='river front'"));
$tot_q1=count($q1);
if($tot_q1<3)
{
$q2=mysql_fetch_array(mysql_query("select * from Table_City where city='ahmedabad' and area_name!='river front'"));
// i add this line *area_name!='river front'* to stop duplicate value such as if river front(mobile shop) is already fetched then i dont need to fetch it again.
}
return $q1+q2;
但是当我在这段代码中实现分页时它更复杂。 我怎么能在一个查询中做到这一点?
尝试类似的东西
SELECT * from (
SELECT table_shop.id, table_shop.shopname, table_shop.address,
table_shop.area_name, table_city.city
FROM table_shop
JOIN table_city on table_shop.area_name = table_city.area_name
WHERE area_name='river front'
UNION
SELECT table_shop.id, table_shop.shopname, table_shop.address, table_shop.area_name, table_city.city
FROM table_shop
JOIN table_city on table_shop.area_name = table_city.area_name
WHERE area_name!='river front'
AND table_city.city='ahmedabad') limit 3
或者
SELECT table_shop.id, table_shop.shopname, table_shop.address,
table_shop.area_name, table_city.city
FROM table_shop
JOIN table_city on table_shop.area_name = table_city.area_name
WHERE table_shop.area_name='river front' OR table_city.city='ahmedabad'
ORDER BY table_shop.area_name <> 'river front',
priority
limit 3
此外,通过文本列area_name
链接表也不是一个好主意。 我建议你创建第三个表,
area {id, name, city_id}
将table_shop
更改为
shop {id, name, address, area_id, contact}
并将table_city
更改为
city {id, name}
此外,在表前加上table_
是多余的,所以我会避免它。
MariaDB [sandbox]> drop table if exists table_shop;
Query OK, 0 rows affected (0.10 sec)
MariaDB [sandbox]> create table table_shop (id int,shopname varchar(20),areaname varchar(20));
Query OK, 0 rows affected (0.18 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> drop table if exists table_city;
Query OK, 0 rows affected (0.08 sec)
MariaDB [sandbox]> create table table_city (id int, areaname varchar(20), city varchar(20));
Query OK, 0 rows affected (0.19 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> insert into table_shop values
-> (1,'Mob','station road'),(2,'food','river road'),(3,'cold drink','river road'),(4,'mob','river front'),
-> (5,'rec','station road'),(6,'Mob','station road'),(7,'mob','station road'),(8,'ice','river road'),
-> (9,'mob','river road');
Query OK, 9 rows affected (0.03 sec)
Records: 9 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> insert into table_city values
-> (1,'station road','ahamabad'),(2,'river road','delhi'),(3,'river front','ahamabad');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]>
MariaDB [sandbox]> select ts.id,ts.shopname, ts.areaname, tc.city, s.*
-> from table_shop ts
-> join table_city tc on tc.areaname = ts.areaname
-> join
-> (
-> select distinct ts.shopname, ts.areaname, tc.city
-> from table_shop ts
-> join table_city tc on tc.areaname = ts.areaname
-> where ts.areaname = 'river front'
-> ) s on s.shopname = ts.shopname and s.city = tc.city
->
-> ;
+------+----------+--------------+----------+----------+-------------+----------+
| id | shopname | areaname | city | shopname | areaname | city |
+------+----------+--------------+----------+----------+-------------+----------+
| 1 | Mob | station road | ahamabad | mob | river front | ahamabad |
| 4 | mob | river front | ahamabad | mob | river front | ahamabad |
| 6 | Mob | station road | ahamabad | mob | river front | ahamabad |
| 7 | mob | station road | ahamabad | mob | river front | ahamabad |
+------+----------+--------------+----------+----------+-------------+----------+
4 rows in set (0.00 sec)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.