Попытка извлечь последний идентификатор из таблицы и группы по определенному столбцу - PullRequest
0 голосов
/ 04 июля 2019

Это дает мне только одну запись, я не знаю, в чем проблема, если я просто зацикливаю весь запрос, тогда он работает

<cfquery name="messages_tb" datasource="appdb">
    SELECT * FROM messages
    WHERE receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
    and rt = <cfqueryparam value="1" cfsqltype="cf_sql_tinyint">
    group by sender
</cfquery>

<cfset list.messages_tb_sender = ValueList(messages_tb.sender)>

<cfquery name="messages_tb" datasource="appdb">
    SELECT * FROM messages
    WHERE sender IN ( <cfqueryparam value="#list.messages_tb_sender#" cfsqltype="cf_sql_integer" list="yes">)
    group BY mid
</cfquery>

<cfoutput>
    #messages_tb.mid#
</cfoutput>

, и вот так выглядит таблица

mid    sender   receiver  message
======|=======|==========|=============
1        2         1        Hello
2        2         1        Hey
3        3         1        xyz
4        2         1        random text

Я хочу данные только с середины № 3 и 4

Ответы [ 2 ]

1 голос
/ 04 июля 2019

(слишком долго для комментариев ...)

  1. Чтобы ответить на ваш вопрос, причина, по которой отображается единственное значение, заключается в том, что в cfoutput отсутствует имя «запроса», как указал Пол. Без имени запроса cfoutput по умолчанию отображает первое значение - в первой строке. Если вы хотите отобразить все строк в запросе, необходимо добавить атрибут «запрос».

    <cfoutput query="messages_tb">
        #messages_tb.mid#
    </cfoutput>
    
  2. Однако вам не нужны два отдельных запроса. Простое JOIN вернет те же результаты в одном запросе.

    SELECT DISTINCT m.Mid
    FROM  messages m INNER JOIN 
          (
            SELECT DISTINCT sender 
            FROM   messages
            WHERE  receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
            AND    rt = <cfqueryparam value="1" cfsqltype="cf_sql_tinyint">
          ) s ON s.sender = m.sender
    
  3. Сказав все это, ни одна из них не вернет ТОЛЬКО записи MID = 3 и 4. Не могли бы вы уточнить?

    A. Что представляет собой колонка «MID»?
    B. Почему запрос должен возвращать только значения 3 и 4?

    Исходя из ваших примеров данных, первый запрос будет возвращать:

    sender
    ======|
    2
    3
    

    Поскольку все записи примеров имеют эти значения отправителя, ваш второй запрос вернет все 4 записи:

    mid    sender 
    ======|=======|
    1        2    
    2        2    
    3        3    
    4        2    
    

    Таким образом, либо ваши примерные данные неверны, либо что-то отсутствует в ваших текущих запросах.

1 голос
/ 04 июля 2019
  1. Если вам нужны только данные середины №: 3 и 4, запрос будет выглядеть следующим образом ...

    <cfquery name="messages_tb" datasource="appdb">
      SELECT mid, sender, receiver, message FROM messages
      WHERE receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
      and mid in <cfqueryparam value="3,4" list="yes" cfsqltype="cf_sql_integer">
    </cfquery>
    
  2. Если вам нужно извлечь последний идентификатор из таблицы и группы по определенному столбцу. Я предполагаю, что середина уникальна в соответствии с выводом таблицы, тогда нам может не понадобиться group by mid

    <cfquery name="messages_tb" datasource="appdb">
      select mid, sender, receiver, message FROM messages
      where mid in (
        select top 1 mid from messages
        and receiver = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
        order by mid desc
        )
    </cfquery>
    

К вашему сведению: как видно из таблицы, столбец с именем rt

отсутствует
...