没关系,抱歉浪费你的时间,仔细检查后我的实时数据确实没有这种情况。当我第一次问我的客户时,应该有一些。他们错了,我要快速责怪MySQL。
情况
在我的应用程序中运行以下查询:
SELECT s.*, c.company_name, c.kvk_number
FROM wp_kvk_statements as s
LEFT JOIN wp_kvk_companies as c ON s.company_id = c.id
WHERE s.status < 2 AND c.status = 1
ORDER BY company_id, s.year DESC
问题
在我的开发服务器上,此查询正确返回wp_kvk_statements中的状态小于2(即0或1)的所有行。对于wp_kvk_companies表中状态为1的公司。
但是在我的实时服务器上只返回wp_kvk_statements中状态为1的行,就好像c.status = 1被解释错误一样。
问题
为什么会发生这种情况,我该如何解决这个问题。
背景资讯
开发服务器MySQL导出(这是它的工作原理):
-- phpMyAdmin SQL Dump
-- version 3.4.10.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Dec 03, 2012 at 01:22 PM
-- Server version: 5.5.20
-- PHP Version: 5.3.10
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
-- --------------------------------------------------------
--
-- Table structure for table `wp_kvk_companies`
--
CREATE TABLE `wp_kvk_companies` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`industry_id` int(11) NOT NULL,
`company_name` char(255) CHARACTER SET utf8 NOT NULL,
`kvk_number` char(12) NOT NULL,
`status` int(11) NOT NULL DEFAULT '1',
`last_crawled` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `wp_kvk_statements`
--
CREATE TABLE `wp_kvk_statements` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL,
`year` int(4) NOT NULL,
`bought` tinyint(1) NOT NULL,
`analyzed` tinyint(1) NOT NULL,
`status` int(11) NOT NULL,
`added` datetime NOT NULL,
`updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_by_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`company_id`,`year`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
实时服务器MySQL导出(这是它被破坏的地方):
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Dec 03, 2012 at 02:25 PM
-- Server version: 5.5.9
-- PHP Version: 5.3.17
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
--
-- Database: `deb51918_annuall`
--
-- --------------------------------------------------------
--
-- Table structure for table `wp_kvk_companies`
--
CREATE TABLE `wp_kvk_companies` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`industry_id` int(11) NOT NULL,
`company_name` char(255) CHARACTER SET utf8 NOT NULL,
`kvk_number` char(12) NOT NULL,
`status` int(11) NOT NULL DEFAULT '1',
`last_crawled` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `wp_kvk_statements`
--
CREATE TABLE `wp_kvk_statements` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL,
`year` int(4) NOT NULL,
`bought` tinyint(1) NOT NULL,
`analyzed` tinyint(1) NOT NULL,
`status` int(11) NOT NULL,
`added` datetime NOT NULL,
`updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_by_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`company_id`,`year`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
答案 0 :(得分:0)
查询执行它应该执行的操作。顺便说一下,LEFT
在那里没用,联接会转换为INNER
联接,因为WHERE
条款包含c.status = 1
条件。那么,您的查询等同于:
SELECT s.*, c.company_name, c.kvk_number
FROM wp_kvk_statements as s
INNER JOIN wp_kvk_companies as c ON s.company_id = c.id
WHERE s.status < 2 AND c.status = 1
ORDER BY company_id, s.year DESC ;
您进一步说:“但在我的实时服务器上,只返回wp_kvk_statements中状态为1的行,...”
您的实时服务器中是否有wp_kvk_statements.status
不等于1的行?另外在wp_kvk_companies
表中还有c.status=1
的相关行?
我猜不是。我的第二个猜测是你误解了查询应该返回什么(左/右混淆可能?)。
如果实时和测试服务器返回不同的结果,您要么在两个服务器中有不同的数据,要么运行(稍微)不同的查询。