2016-09-17 108 views
-1

我有两个表,并希望在创建日期的同一页面中显示来自两个表中的行。从两个表中获取数据并区分它们

这里我的查询:

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`) 
) 
+0

发表你的表返回和购买架构 – scaisEdge

+0

我不认为'union all'对你的问题有意义。您应该编辑您的问题并提供样本数据和期望的结果。 –

+0

因为'union all'需要相同的结构,在我的情况下是这样使用它是错误的...我正在寻找一种方法来显示在创建日期排序的同一页中的两个表的结果。 –

回答

1

确保两个表returnbuy具有相同数量(和类型顺序)..如果没有查询失败

尽量选择只从表都需要列,并确保这些在correspondenting数量和类型

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 
........ 

展望你的代码,你应该选择相同数量和列形式的类型boith见下表如德示例: (其中我已经添加了不同的列,然后从空表不存在) 我有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 

你应该在你的情况下使用的第一列的retrive TE值

echo $hist_rows["source_table"]; 

否则我两个表中以某种方式与你应该看看一个连接(左连接)的链接这两个表,并选择了repated列 (不过这是另外一个问题)

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

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 
+0

这两个表的结构不一样 –

+0

然后select with union failed ..在这种情况下,如果你需要一个带有公共列的select,你可以选择显式的只有你需要的列..否则你必须执行两个不同的select .. – scaisEdge

+0

我想让一个查询显示两个表的结果 –

0

由于您使用的是工会,选择设置识别每个查询字符串:

SELECT 'R', R.*, R.id as id_return 
FROM return R 
UNION 
ALL 
SELECT 'A', A.*, A.id as id_buy 

这样你的字符串'R'或'A'是第一列,显示它来自哪里。如果没有完整的查询,我们无法真正了解它的失败原因,但是我猜你的$ from可能是空的?

至于你

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

运行查询直接率先拿到了SQL把它变成你的PHP脚本之前整理出来。布尔值false表示查询失败。 colummns的

+0

我删除了'$ from',仍然得到错误:( –

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; 

这个查询只是一个猜测,你可能想要什么。

+0

返回也是一个保留字(R) – Drew

+0

此查询仅返回表“RETURN”的重复结果,而不返回“BUY”表中的任何结果。 –

相关问题