簡體   English   中英

MySQL:選擇所有包含ID的行

[英]MySQL: Select all rows containing the ID

我正在嘗試編寫一個MySQL查詢,該查詢應從兩個不同的表中選擇行。 我進行了不同數量的查詢,但是它們都花了很長時間才能返回結果(> 0.6秒)。 我希望得到更快的答復。

情況是:

CREATE TABLE `classes` (
   id int(99) auto_increment primary key,
   status INT(1)
)

CREATE TABLE `classes_names` (
   id int(99) auto_increment primary key,
   class_id int(99),
   name VARCHAR(255)
)

可以說,您應該獲得該類中的所有名稱,但要搜索的名稱除外。 例如,我的名字是“ John Doe”,因此我們搜索這樣的名字:

SELECT
  classes_names.`id`

FROM
  `classes_names`

INNER JOIN `classes`
  ON `status` = 1

WHERE
  `name`='John Doe'

在此查詢中,我的名字將與我的班級ID一起返回。 事情是,我希望“班級成員”退回自己。 所以說我們有這個表:

+------+----------+
| id   | status   |
+------+----------+
|    1 | 1        |
|    2 | 1        |
+------+----------+

+------+----------+---------------+----------+
| id   | class_id | name                     |
+------+----------+--------+-----------------+
|    1 | 1        | John Doe                 |
|    2 | 1        | Alexandra Fito           |
|    3 | 2        | Rico Hasti               |
|    4 | 1        | Lady Gaga                |
+------+----------+--------------------------+

我想用詞“描述”來執行查詢: SELECT class_names.id WHERE SAME CLASS HAS NAME 'John Doe'. 返回的行應該是該類中的所有成員-沒有搜索到的名稱...所以我應該期待的結果是:

+------+----------+---------------+----------+
| id   | class_id | name                     |
+------+----------+--------+-----------------+
|    2 | 1        | Alexandra Fito           |
|    4 | 1        | Lady Gaga                |
+------+----------+--------------------------+

如此...有人想試一下嗎? 去吧!

這應該工作:

SELECT a.name, 
       b.class_id 
FROM   classes_names a 
       INNER JOIN (SELECT id, 
                          class_id 
                   FROM   classes_names 
                   WHERE  name = 'John Doe') b 
               ON b.class_id = a.class_id 
                  AND a.id <> b.id 

結果

|           NAME | CLASS_ID |
-----------------------------
| Alexandra Fito |        1 |
|      Lady Gaga |        1 |

觀看演示

SELECT * FROM classes_names 
WHERE class_id IN (
     SELECT id FROM classes_names 
     WHERE name = "John Doe")
AND name != "John Doe"

我應該指出,我不明白指出您的“英語查詢”中沒有的status位。

最好的英語翻譯是:

“選擇與John Doe所在班級具有class_id的班級中的任何人,而不是John Doe。”

SELECT
  classes_names.`id`

FROM
  `classes_names`

Left JOIN `classes`
  (SELECT class_id
FROM classes_names
WHERE name LIKE "John Doe"
) the_class ON classes_names.class_id = the_class.class_id


WHERE
  `status`=1 and
  `name`NOT LIKE'John Doe'
SELECT classes_names.id
FROM classes_names

INNER JOIN (
    SELECT class_id
    FROM classes_names
    WHERE name LIKE "John Doe"
) class_john_doe 
ON (
    classes_names.class_id = class_john_doe.class_id
    AND class_john_doe.id != classes_names.id
)

為了提高性能,您應該在classes_names.class_id和classes.id上設置索引

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM