我有两个表,希望在按创建日期排序的同一页面中显示两个表中的行。
这是我的查询:
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 :(得分:1)
确保两个表return
和buy
具有相同的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表示查询失败。