2016-10-04 4 views
-1

Я не знаю почему, но я не могу понять это. У меня есть две таблицы:SQL несколько подзапросов таблицы

mysql> select * from PETICIONES;                        +--------+------------+--------+-----------+-----------+ 
| ID_PET | FECHA_PET | ID_ANA | DNI_PAC | DNI_DOC | 
+--------+------------+--------+-----------+-----------+ 
|  1 | 2008-01-03 |  2 | 71515623A | 23456398F | 
|  2 | 2008-05-10 |  2 | 33788976F | 55776898K | 
|  3 | 2008-05-08 |  3 | 79876867X | 23456398F | 
|  4 | 2008-05-11 |  4 | 44787345H | 55776898K | 
|  5 | 2008-05-12 |  2 | 19887234W | 25349857H | 
|  6 | 2008-05-05 |  4 | 22897576R | 55776898K | 
|  7 | 2008-03-15 |  5 | 44787345H | 88647389P | 
|  8 | 2008-03-19 |  1 | 71515623A | 23456398F | 
|  9 | 2008-03-26 |  2 | 71515623A | 78988484B | 
|  10 | 2008-03-15 |  2 | 19887234W | 88647389P | 
|  11 | 2008-03-15 |  3 | 33788976F | 55776898K | 
|  12 | 2008-03-26 |  2 | 44787345H | 23456398F | 
+--------+------------+--------+-----------+-----------+ 

и

mysql> select * from TIPOS_ANALISIS; 
+--------+-----------------+ 
| ID_ANA | DESC_ANA  | 
+--------+-----------------+ 
|  1 | SANGRE BÁSICO | 
|  2 | SANGRE COMPLETO | 
|  3 | ORINA BÁSICO | 
|  4 | ORINA COMPLETO | 
|  5 | HECES BÁSICO | 
|  6 | HECES COMPLETO | 
+--------+-----------------+ 

Теперь все, что мне нужно сделать, это найти анализ, который был заказан самый и отображать его детали. Теперь я могу найти анализ, который был заказан больше раз, чем другие, но присоединиться к этим двум таблицам, чтобы я мог показать, что это описание - это то, с чем я не слишком хорошо справляюсь. Я попытался это, но он просто trows ошибки, и я не могу разобраться (ошибка: Операнд должен содержать 1 столбец (ы)):

Select * from TIPOS_ANALISIS 
    -> where ID_ANA = (SELECT ID_ANA, COUNT(ID_ANA) as AnaCount 
    -> from PETICIONES 
    -> group by ID_ANA 
    -> order by AnaCount DESC 
    -> limit 1); 
мог

кто-то помочь и объяснить немного? Пожалуйста?

А что, если бы я хотел отображать количество отсчетов? Как мне это сделать?

+0

См http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to- я все-таки-очень-простой-sql-запрос – Strawberry

+0

все хорошо, и все это, но это моя база данных практики, и я пытаюсь понять некоторые понятия. Очевидно, что я читал теорию об этом и все, но, очевидно, испытываю трудности с получением вещей. О, и я действительно ценю, что это очень легко и не стоит их время для некоторых, но поскольку я только начинаю с SQL сам, это не кажется таким легким. Со временем я верю в это, но я еще не совсем там. И я смею верить, что таких меня много. – CNB

ответ

1

Попробуйте это:

Select a.* 
from TIPOS_ANALISIS a 
where a.ID_ANA = (select p.ID_ANA 
        from PETICIONES p 
        group by p.ID_ANA 
        order by AnaCount DESC 
        limit 1 
       ); 

Ошибка в том, что подзапрос является скалярной подзапроса, а это означает, что он должен возвращать один столбец и не более одной строки. Скалярный подзапрос используется вместо постоянного значения в SQL.

Я не уверен на 100%, что это будет работать в MySQL. MySQL в этом вопросе весьма близок к limit в некоторых подзапросах.

Но, вы можете просто больше это к from статье:

Select a.*, p.AnaCount 
from TIPOS_ANALISIS a join 
    (select p.ID_ANA, count(*) as AnaCount 
    from PETICIONES p 
    group by p.ID_ANA 
    order by AnaCount DESC 
    limit 1 
    ) p 
    on a.ID_ANA = p.ID_ANA 
+0

Что такое AnaCount? – Christian

+0

Спасибо, после небольшой настройки второй работал, и я думаю, что я понимаю, почему он работает. Так что действительно постигнут. Постараюсь разобраться в том, что происходит в мире (если смогу). – CNB

+0

@ Христианский эй, вы можете видеть в select p.ID_ANA, count (*) как AnaCount, это как переменная, но будьте осторожны, если вы делаете из таблицы, так как вы не можете получить доступ к таблице имен больше, она изменена на t для этого запроса :) –

1

Попробуйте использовать

Select a.* 
from TIPOS_ANALISIS a 
where a.ID_ANA = (select b.ID_ANA 
        from PETICIONES b 
        group by b.ID_ANA 
        order by count(*) DESC 
        limit 1 
       ); 
+0

Это действительно работает отлично. – CNB

0

Вы должны выбрать только ID_ANA из подвыборки

select * from TIPOS_ANALISIS 
where ID_ANA = (SELECT ID_ANA 
       from PETICIONES 
       group by ID_ANA 
       order by COUNT(ID_ANA) 
       limit 1) 
1

Это уже говорил вы должны иметь только 1 столбец. Просто выберите 1 столбец из вашего внутреннего запроса:

Select * from TIPOS_ANALISIS 
where ID_ANA = (SELECT ID_ANA FROM (SELECT ID_ANA, COUNT(ID_ANA) as AnaCount 
from PETICIONES 
group by ID_ANA 
order by AnaCount DESC 
limit 1) t1); 

#Edit: To display counts as well 

SELECT ID_ANA, COUNT(ID_ANA) AS count from TIPOS_ANALISIS 
    WHERE ID_ANA = (SELECT ID_ANA FROM (SELECT ID_ANA, COUNT(ID_ANA) as AnaCount 
from PETICIONES 
    group by ID_ANA 
    order by AnaCount DESC limit 1) t1) 
GROUP BY ID_ANA; 
+0

Это было полезно, спасибо. – CNB

+0

Добро пожаловать :) –

+0

И если бы я хотел отобразить количество отсчетов, как мне это сделать? – CNB