Php 搜索具有count(*)的多个表的查询?

Php 搜索具有count(*)的多个表的查询?,php,mysql,search,Php,Mysql,Search,我有一个在线商店的搜索字段,它使用MySQL查询两个不同的表。第一个表是乙烯基,共有13列,第二个表是产品,共有10列。我想要的结果是,如果输入关键字,它将搜索表vinyls的album_name和artist_name列,以及表products中的name列以查找任何匹配项 我的php代码首先计算点击次数,如果点击了,则再次使用查询来显示点击次数,就像在线商店一样。但是,当我测试它时,它只显示乙烯基表的结果,而不显示产品表的结果。我尝试过使用UNION,但由于两个表的列数不同,因此会导致错误。

我有一个在线商店的搜索字段,它使用MySQL查询两个不同的表。第一个表是乙烯基,共有13列,第二个表是产品,共有10列。我想要的结果是,如果输入关键字,它将搜索表vinyls的album_name和artist_name列,以及表products中的name列以查找任何匹配项

我的php代码首先计算点击次数,如果点击了,则再次使用查询来显示点击次数,就像在线商店一样。但是,当我测试它时,它只显示乙烯基表的结果,而不显示产品表的结果。我尝试过使用UNION,但由于两个表的列数不同,因此会导致错误。我使用NULL来填充union所需的缺少的列,但它也不起作用。联接也没有帮助,因为这两个表没有任何类似的列。最复杂的是在第一次查询中使用count*

使用UNION和COUNT的我的SQL查询:

(SELECT COUNT(*) AS numrows 
FROM vinyls 
WHERE (     album_name LIKE :keyword 
        OR  artist_name LIKE :keyword)
      ) 
union 
(SELECT COUNT(*) AS numrows 
FROM products 
WHERE name LIKE :keyword)
搜索字段的我的php代码:

$stmt = $conn->prepare("(SELECT COUNT(*) AS numrows 
                        FROM vinyls 
                        WHERE (     album_name LIKE :keyword 
                                OR  artist_name LIKE :keyword)
                              ) 
                        union 
                        (SELECT COUNT(*) AS numrows 
                        FROM products 
                        WHERE name LIKE :keyword)");

$stmt->execute(['keyword' => '%'.$_POST['keyword'].'%']);
$row = $stmt->fetch();


if($row['numrows'] < 1){
    echo '<h1 class="page-header">No results found for <i>'.$_POST['keyword'].'</i></h1>';
}else{
    echo '<h1 class="page-header">Search results for <i>'.$_POST['keyword'].'</i></h1>';
    try{
        $inc = 3;   
        $stmt = $conn->prepare("(SELECT * 
                                FROM vinyls 
                                WHERE (     album_name LIKE :keyword 
                                        OR  artist_name LIKE :keyword)
                                    ) 
                                union 
                                (SELECT * 
                                FROM products 
                                WHERE name LIKE :keyword)");

        $stmt->execute(['keyword' => '%'.$_POST['keyword'].'%']);

        foreach ($stmt as $row) {...
我已经对如何只从一个搜索字段中搜索两个表并显示两个表而不是一个表的结果感到困惑。在向购物车添加商品时也存在类似的问题,因为它们可以来自两个表,我必须再次连接这两个表

我哪里出错了

编辑: 样本数据 乙烯基表 +--+---------+--------------+------+ |id |专辑名|艺术家名|流派| +--+---------+--------------+------+ |11 |拉威尔·博莱罗|波士顿交响乐团|古典| |12 |电视日历节目|亚瑟·戈弗雷|管弦乐队| |13 |弗利普·菲利普斯|菲利普斯四重奏|爵士乐| |14 |现代成语|各种艺术家|爵士乐| +--+---------+--------------+------+

产品表 +--+-------+---------------------------+ |id |类别| id |名称| +--+-------+---------------------------+ |31 | 15 | Tonka/压铸卡车和汽车| |32 | 21 |板号格鲁吉亚PQQ 1151| |33 | 6 |沃尔特·迪斯尼沿着卡塞特录音带阅读| |34 | 7 |赫伯特·冯·卡拉扬| |35 | 8 |银行!棋盘游戏| |36 | 9 |伊拉克头号通缉扑克牌| |37 | 10 |星际迷航1991,'92,'93邮票绿洲橡皮邮票| |38 | 11 |蝙蝠侠和朋友动作人偶玩具4-5| |39 | 12 |三角洲黎明瓷娃娃| +--+-------+---------------------------+

预期结果类似于亚马逊的搜索栏,在这里输入关键字,结果在输入后显示。我想在我的网站上看到的是,如果我在搜索字段中键入chestration,它将显示波士顿交响乐团的行。或者如果我输入cars,它将显示tonka行


我得到的是,它只显示乙烯基表,而从不显示产品表,即使我键入汽车,产品表中应该有一个命中。或者我得到一个错误,因为union只适用于列数相似的表。

代码中有两个问题

首先,您的count查询应该可以工作并且不会抛出错误,但是您只查看第一个结果行,即乙烯基。但是您的查询返回两行。对于第一个联合查询乙烯基,它将返回一行带有numrows字段,对于联合中的第二个查询产品,它将返回一行带有numrows字段

您可以将其包装为一个总和,以便只返回一个结果行:

$stmt=$conn->prepare从中选择SUMnumrows作为numrows 选择COUNT*作为numrows 从乙烯基 其中相册名称类似:关键字 或艺术家名称,如:关键字 协会 选择COUNT*作为numrows 来自产品 其中name LIKE:关键字AS sumQuery; 第二个问题是查询,它加载结果并抛出异常,因为列计数不匹配。您必须定义应该返回两个联合查询中每个查询的哪些列,并且它们必须在这两个查询上匹配。因此,f.e.这样做:

$stmt=$conn->prepareSELECT id,专辑名称作为名称,艺术家名称 从乙烯基 其中相册名称类似:关键字 或艺术家名称,如:关键字 协会 选择id、名称、空作为艺术家名称 来自产品 哪里 名称:关键字;
您可以将字段/列名传递给计数函数Update your question add a property data sample and the expected result我已经尝试过了,但它无法识别numrows,并在if$行['numrows']<1行中抛出“undefined index:numrows”错误。我还在cmd中运行了一个查询,但它仍然给出了两行。已更新查询,请重试: