从两个表中获取数据并区分它们

时间:2016-09-17 16:35:13

标签: php mysql mysqli

我有两个表,希望在按创建日期排序的同一页面中显示两个表中的行。

这是我的查询:

SELECT  R.*, R.id as id_return
FROM    return R
UNION
ALL
SELECT  A.*, A.id as id_buy
FROM    buy A
WHERE
R.id_buyer = '$user' AND R.id_buyer = A.id_buyer AND (R.stats='1' OR R.stats='3') OR A.stats='4'
ORDER
BY R.date, A.date DESC LIMIT $from , 20

使用此查询,我收到以下错误消息:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in ...

在这里我认为我可以区分结果:(知道结果是来自表RETURN还是来自表BUY

if(isset($hist_rows["id_return"])) {
   // show RETURN rows
} else {
   // show BUY rows
}

请问查询有什么问题,以及区分表的方法是否正确?

修改

我的表格示例如下:

CREATE TABLE IF NOT EXISTS `return` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_buyer` INT(12) NOT NULL,
`id_seller` INT(12) NOT NULL,
`message` TEXT NOT NULL,
`stats` INT(1) NOT NULL,
`date` varchar(30) NOT NULL,
`update`  varchar(30)
PRIMARY KEY (`id`)
)


CREATE TABLE IF NOT EXISTS `buy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_buyer` INT(12) NOT NULL,
`product` INT(12) NOT NULL,
`title` VARCHAR(250) NOT NULL,
`stats` INT(1) NOT NULL,
`date` varchar(30) NOT NULL
PRIMARY KEY (`id`)
)

3 个答案:

答案 0 :(得分:1)

确保两个表returnbuy具有相同的colummns数字(和类型序列)..否则查询失败

尝试从表格中仅选择所需的列,并确保这些列具有相应的数字和类型

SELECT  R.col1, R.col2, R.id as id_return
FROM    return R
UNION ALL
SELECT  A.col1, A.col2,  A.id as id_buy
FROM    buy A
WHERE
........

查看您的代码,您应该选择相同数量和类型的列表格,例如下面的示例: (我已经添加了不同的列并从表中选择null不存在) 我有aslore在每个表格中提到适当的条件。

SELECT  
     R.'from return' as `source_table`
   , R.`id` 
   , R.`id_buyer` 
   , null as product
   , null as title
   , R.`id_seller` as id_seller
   , R-`message` 
   , R.`stats` 
   , R.`date` 
   , R.`update`
FROM    return R
WHERE R.id_buyer = '$user'
AND (R.stats='1' OR R.stats='3')
UNION ALL 
SELECT  
     A.'from buy'
   , A.`id` 
   , A.`id_buyer` 
   , A.`product` 
   , A.`title` 
   , null 
   , null
   , A.`stats` 
   , A.`date` 
   , null
FROM    buy A
WHERE 
A.id_buyer = '$user'
AND A.stats='4'
ORDER BY `source table`, date DESC LIMIT $from , 20

您应该在案例中使用的第一列的反向值

echo  $hist_rows["source_table"];

否则我这两个表在某种程度上是相关的你应该看一个连接(左连接)来链接两个表并选择重复列 (但这是另一个问题)

但如果您需要左连接,可以尝试

SELECT  
    R.`id` 
   , R.`id_buyer` 
   , R.`id_seller` as id_seller
   , R-`message` 
   , R.`stats` 
   , R.`date` 
   , R.`update`
   , A.`id` 
   , A.`id_buyer` 
   , A.`product` 
   , A.`title` 
   , null 
   , null
   , A.`stats` 
   , A.`date` 
FROM    return  R
LEFT JOIN buy A ON  R.id_buyer = A.id_buyer 
AND  R.id_buyer = '$user' 
AND (R.stats='1' OR R.stats='3')
AND A.stats='4'
ORDER BY R.date DESC LIMIT $from , 20

答案 1 :(得分:1)

当您使用union all时,查询需要完全相同的列中的相同列。如果类型不完全相同,那么它们将转换为相同的类型。

所以,你不想要union all。我猜你想要join。像这样:

SELECT r.co1, r.col2, . . ., r.id as id_return,
       b.col1, b.col2, . . ., b.id as id_buy
FROM return r JOIN
     buy b
     ON r.id_buyer = b.id_buyer
WHERE r.id_buyer = '$user' and
      (r.stats in (1, 3) OR A.stats = 4)
ORDER BY R.date, A.date DESC
LIMIT $from, 20;

此查询只是猜测您可能需要的内容。

答案 2 :(得分:0)

由于您正在使用联合,因此请选择您设置的标识每个查询的字符串:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in ...

这样你的字符串'R'或'A'就是第一列,显示它来自哪里。如果没有完整的查询,我们真的不知道为什么它会失败,但我猜你的$ from可能是空的?

至于你的

word2vec

首先直接运行查询,以便在将sql放入PHP脚本之前对其进行整理。布尔值false表示查询失败。