1

没关系,很抱歉浪费您的时间,经过仔细检查,在我的实时数据中确实没有这种情况。当我第一次问我的客户时,应该有一些。他们哪里错了,我要快速归咎于 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;
4

1 回答 1

0

查询做了它应该做的事情。顺便说一句,LEFT那里是无用的,连接被转换为INNER连接,因为WHEREclase 包含一个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

我猜不会。我的第二个猜测是您误解了查询应该返回的内容(LEFT/INNER 混淆可能?)。

如果实时服务器和测试服务器返回不同的结果,那么您要么在两台服务器中有不同的数据,要么正在运行(稍微)不同的查询。

于 2012-12-03T14:36:16.363 回答