5

これが私のテーブルとそれに含まれるデータです:

Table: first

+----------+------+
| first_id | data |
+----------+------+
|        1 |    5 |
|        2 |    6 |
|        3 |    7 |
|        4 |    6 |
|        5 |    7 |
|        6 |    5 |
|        7 |    7 |
|        8 |    6 |
|        9 |    5 |
|       10 |    7 |
+----------+------+

Table: second
+-----------+----------+----------+
| second_id | first_id | third_id |
+-----------+----------+----------+
|         1 |        1 |        2 |
|         2 |        2 |        3 |
|         3 |        3 |        4 |
|         4 |        4 |        2 |
|         5 |        5 |        3 |
|         6 |        6 |        4 |
|         7 |        7 |        2 |
|         8 |        8 |        2 |
|         9 |        9 |        4 |
|        10 |       10 |        4 |
+-----------+----------+----------+

私の意図は、フィールドごとにthird_id並べられた のリストを取得することです。dataさて、そのために次のクエリを実行しました。

SELECT
    third_id, data
FROM 
    first f JOIN second s ON ( s.first_id = f.first_id )
ORDER BY 
    data ASC;

そして、期待どおりに次の結果が得られます。

+----------+------+
| third_id | data |
+----------+------+
|        4 |    5 |
|        2 |    5 |
|        4 |    5 |
|        2 |    6 |
|        3 |    6 |
|        2 |    6 |
|        2 |    7 |
|        4 |    7 |
|        4 |    7 |
|        3 |    7 |
+----------+------+

次のクエリも期待どおりに機能します。

SELECT 
    third_id
FROM 
    first f JOIN second s ON ( s.first_id = f.first_id )
ORDER BY 
    data ASC;

出力あり

+----------+
| third_id |
+----------+
|        4 |
|        2 |
|        4 |
|        2 |
|        3 |
|        2 |
|        2 |
|        4 |
|        4 |
|        3 |
+----------+

次に、次を実行しました。

SELECT DISTINCT
    third_id
FROM 
    first f JOIN second s ON ( s.first_id = f.first_id )
ORDER BY 
    data ASC;

しかし、ここで予期しない結果が得られます。

+----------+
| third_id |
+----------+
|        2 |
|        3 |
|        4 |
+----------+

ここでは、フィールドで注文するので、 と の後にある3必要があります。私は何を間違っていますか?それとも、別の戦略を取らなければなりませんか。24data

注: このシナリオは私のプロジェクトで発生します。ここで提供されるテーブルは、元のデータベースに属していません。問題を説明するために私が作成しました。元のテーブルには数千の行が含まれています。データを試してみたい場合は、データベース ダンプを挿入します。

--
-- Table structure for table `first`
--

CREATE TABLE IF NOT EXISTS `first` (
  `first_id` int(11) NOT NULL AUTO_INCREMENT,
  `data` int(11) NOT NULL,
  PRIMARY KEY (`first_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `first`
--

INSERT INTO `first` (`first_id`, `data`) VALUES
(1, 5),
(2, 6),
(3, 7),
(4, 6),
(5, 7),
(6, 5),
(7, 7),
(8, 6),
(9, 5),
(10, 7);
--
-- Table structure for table `second`
--

CREATE TABLE IF NOT EXISTS `second` (
  `second_id` int(11) NOT NULL AUTO_INCREMENT,
  `first_id` int(11) NOT NULL,
  `third_id` int(11) NOT NULL,
  PRIMARY KEY (`second_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `second`
--

INSERT INTO `second` (`second_id`, `first_id`, `third_id`) VALUES
(1, 1, 2),
(2, 2, 3),
(3, 3, 4),
(4, 4, 2),
(5, 5, 3),
(6, 6, 4),
(7, 7, 2),
(8, 8, 2),
(9, 9, 4),
(10, 10, 4);
4

4 に答える 4

3

あなたはおそらく次のようなことをしたいでしょう

SELECT third_id
FROM first JOIN second USING (first_id)
GROUP BY third_id
ORDER BY aggregatesomething(data)

それはmin(data)、またはmax(data)何でもです。

于 2012-04-10T12:35:31.840 に答える
2

サブクエリを使用できます-

SELECT DISTINCT third_id FROM (
  SELECT
    third_id
  FROM 
    first f JOIN second s ON ( s.first_id = f.first_id )
  ORDER BY 
    data ASC
) t;

最初にすべてのデータを選択して並べ替え、次に個別の値を選択すると役立ちます。

于 2012-04-10T12:41:00.733 に答える
2

これを行うにSELECT DISTINCTは、データベースが列の値を順序付けする必要があります。これが、個別の値を見つける最も効率的な方法だからです。私が知る限りORDER BY、クエリで出力される列を含まない句は受け入れられません (SQL SERVER はクエリを受け入れません)。 .

于 2012-04-10T12:36:07.170 に答える
1

私は以前にこの正確な問題を抱えていました。私はついに簡単な解決策を思いつきました。ほとんど単純すぎるようです。選択クエリの列としてサブクエリを使用する必要があります。そのサブクエリでは、日付による順序付けを行います。ORDER BY を使用して単一のクエリですべてを実行すると、JOIN の前に発生します。最初に注文したいので、サブクエリを使用します。http://nathansnoggin.blogspot.com/2009/04/select-distinct-with-order-by.html

于 2012-04-10T12:53:20.323 に答える