gpt4 book ai didi

php - 单个查询从具有不同列的多个表中获取记录

转载 作者:行者123 更新时间:2023-11-29 06:57:27 24 4
gpt4 key购买 nike

我有 2 个不同的表,因为想要在单个查询中获取记录。目前,我正在使用 2 个查询,然后合并数组结果,然后显示记录。以下是我当前的代码:

$db = JFactory::getDbo();
$query1 = "SELECT a.id as cId, a.title, a.parent_id,a.level FROM `categories` AS a WHERE ( a.title LIKE '%keyword%' )";
$result1 = $db->setQuery($query1)->loadObjectlist(); //gives selected records

$query2 = "SELECT b.id as indId, b.indicator , b.cat_id, b.subcat_id, b.section_id FROM `indicator` as b WHERE ( b.indicator LIKE '%keyword%' )";
$result2 = $db->setQuery($query2)->loadObjectlist(); //gives selected records

$_items = array_merge($result1,$result2); //then using $_items in php code to display the data

它在 Joomla 中,但我只想知道如何将这 2 个查询合并为一个。我尝试了以下操作,但它给出了类别表中第一个查询的结果。

(SELECT id as cId, title, parent_id,level, NULL FROM `categories`  WHERE ( title LIKE '%birth%' )) 
UNION ALL
(SELECT id as indId, indicator , cat_id, subcat_id, section_id FROM `indicator` WHERE ( indicator LIKE '%birth%' ))

所需输出:

+------+-------------+------------+--------+--------+----------------+--------+-----------+----------+
| cId | title | parent_id | level | indId | indicator | cat_id | subcat_id | section_id
+------+-------------+------------+--------+--------+----------------+--------+-----------+----------+
| 2874 | births | 2703 | 2 | null | null | null | null | null |
+------+-------------+------------+--------+--------+----------------+--------+-----------+----------+
| 13 | birth weight| 12 | 3 | null | null | null | null | null |
+------+-------------+------------+--------+--------+----------------+--------+-----------+----------+
| null | null | null | null | 135 | resident births| 23 | 25 | 1 |
+------+-------------+------------+--------+--------+----------------+--------+-----------+----------+
| null | null | null | null | 189 | births summary | 23 | 25 | 1 |
+------+-------------+------------+--------+--------+----------------+--------+-----------+----------+

上面的输出将有助于获得正确的分页记录。我尝试使用联接,但 JOIN 需要 ON 子句 中的公共(public)列。在这里,我想要所有列及其值。基本上我想将 2 个表记录合并到一个查询中。任何帮助将不胜感激

最佳答案

这是一个例子,

有多种方法可以实现此目的,具体取决于您的真正需求。由于没有通用色谱柱,您需要决定是否要引入通用色谱柱或获取产品。

假设您有两个表:

parts:              custs:
+----+----------+ +-----+------+
| id | desc | | id | name |
+----+----------+ +-----+------+
| 1 | Sprocket | | 100 | Bob |
| 2 | Flange | | 101 | Paul |
+----+----------+ +-----+------+

忘记实际的列,因为在这种情况下您很可能拥有客户/订单/零件关系;我只是使用这些专栏来说明实现此目的的方法。

笛卡尔积会将第一个表中的每一行与第二个表中的每一行相匹配:

> select * from parts, custs;
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
1 Sprocket 102 Paul
2 Flange 101 Bob
2 Flange 102 Paul

这可能不是您想要的,因为 1000 个零件和 100 个客户将导致 100,000 行包含大量重复信息。

或者,您可以使用联合来仅输出数据,尽管不是并排(您需要通过使表列兼容或强制它们来确保两个选择之间的列类型兼容)在选择中):

> select id as pid, desc, '' as cid, '' as name from parts
union
select '' as pid, '' as desc, id as cid, name from custs;
pid desc cid name
--- ---- --- ----
101 Bob
102 Paul
1 Sprocket
2 Flange

在某些数据库中,您可以使用 rowid/rownum 列或伪列来并排匹配记录,例如:

id desc     id  name
-- ---- --- ----
1 Sprocket 101 Bob
2 Flange 101 Bob

代码类似于:

select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;

它仍然笛卡尔积,但 where 子句限制了如何组合行以形成结果(所以根本不是笛卡尔积,真的)。

我还没有为此测试该 SQL,因为它是我选择的 DBMS 的限制之一,因此,我认为在经过深思熟虑的模式中不需要它。由于 SQL 不保证其生成数据的顺序,因此每次执行查询时匹配都可能会发生变化,除非您有特定关系或order by子句。

我认为理想的做法是向两个表添加一列,指定关系是什么。如果没有真正的关系,那么您可能没有必要尝试将它们与 SQL 并排放置。

关于php - 单个查询从具有不同列的多个表中获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45051024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com