2013-04-27 4 views
1

Я делаю следующий запрос:запроса с подзапрос не возвращает все результаты

SELECT id, name, keyt 
FROM table 
WHERE id = (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND() LIMIT 1) 

Предположив таблица выглядит так:

| id | name  | keyt | 
+ ------------------------- + 
| 1 | Hello  | 21  | 
| 3 | Katzet | 1  | 
| 1 | Welcome | 1  | 
| 2 | Two  | 21  | 
| 2 | Other  | 1  | 

Он должен возвращение один из этих пар:

  • Hello | Добро пожаловать (id)
  • Два | Другой (ID общих)

Итак, идея:
Получить один идентификатор, который имеет значение keyt набора до 21
Затем получить все строки с этим выбранным идентификатором (независимо от всех других Keyt значений)

Если я, как вы предложили ... Я бы получить смешанные идентификаторы значения, и все строки результата должны иметь одинаковый идентификатор .

ответ

1
SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT id 
     FROM my_table 
     WHERE keyt = 21 
     ORDER 
      BY RAND() LIMIT 1 
    ) y 
    ON y.id = x.id; 
+0

Ну, хороший. Это отлично работает. Но, пожалуйста, коротко объясните мне, почему другой вариант не был точным? Большое спасибо :) –

+0

Извините, я не знаю – Strawberry

1

Подзапрос в этом запросе

SELECT id, name, keyt FROM table WHERE id = (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND() LIMIT 1)

будет возвращать только одну запись, как это имеет LIMIT 1 добавил в конце.

Кроме того, в вашем вопросе, таблица содержит только 1 запись, для которой значение keyt = 21, благодаря которому вы получаете только одну запись.

Если вы хотите больше записей, вы должны удалить LIMIT. В этом случае вы можете перефразировать ваш запрос как:

SELECT id, name, keyt FROM table WHERE id IN (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND())

Надежда это то, что вы ожидали. Поскольку ваша конкретная цель не совсем ясна из вопроса.

+0

Привет, спасибо, что нашли время. Я думаю, что я не сделал хорошего примера. Я обновил свой вопрос, чтобы вы могли лучше понять, что мне нужно. Но, во всяком случае, почему LIMIT подзапроса влияет на запрос PRIMARY? Моя идея - получить случайный идентификатор, где я знаю, что у него есть ключ 'keyt' = 21, а затем выводятся все строки с этим id :) –

+0

, но в подзапросе должен быть возвращен только один результат @ theghostofc – BK004

+1

@Bhushan, это зависит от тип подзапроса. Подзапрос для предложения WHERE должен возвращать один результат, но подзапрос для предложения 'IN' может возвращать несколько результатов. –

0

Ваш стол имеет два 21 в Keyt колонке, чтобы ваш подзапрос в котором условие возвращает 2 значения, если идентификатор, 1 и 2.So то, что вам нужно сделать, это вместо того, чтобы использовать равное оператору «= «используйте оператор IN в предложении where.

SELECT id, name, keyt FROM table WHERE id IN (SELECT t2.id FROM table t2 WHERE t2.keyt=21 ORDER BY RAND()) 
Смежные вопросы