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 の会社の場合。

しかし、私のライブ サーバーでは、c.status = 1 が間違って解釈されたかのように、wp_kvk_statements のステータスが 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に変換します。SO、あなたのクエリは次と同等です:INNERWHEREc.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?

そうではないと思います。私の 2 番目の推測は、クエリが返すものを誤解していることです (LEFT/INNER の混乱でしょうか?)。

ライブ サーバーとテスト サーバーが異なる結果を返す場合、2 つのサーバーに異なるデータがあるか、(わずかに) 異なるクエリを実行しています。

于 2012-12-03T14:36:16.363 に答える