繁体   English   中英

如何合并来自不同表的两个查询的结果?

[英]How to combine results of two query from different tables?

我有两张桌子:

  1. 表店:

    字段:id, shopname, address, area_name, contact

  2. 表_城市:

    字段: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM