programing

다음 MYSQL Entry를 주문에 머무르게 하다

kingscode 2022. 10. 2. 18:58
반응형

다음 MYSQL Entry를 주문에 머무르게 하다

CRM에서 고객은 데이터를 검색하여 정렬하고 ID가 12인 위치 번호9의 데이터처럼 하나의 데이터를 엽니다.고객은 다음 엔트리를 저장하고 다음 엔트리를 얻습니다.예: ID가 6인 제 엔트리의 다음 엔트리는 어떻게 얻을 수 있을까요?

과거에 저는 모든 것을 가져오고 엔트리를 검색하여 다음 엔트리를 얻기 위해 루프를 실행했지만, 더 나은 옵션이 될 것이라고 생각합니다. 제 방법은 성능이 좋지 않았습니다.

감사해요.

  SELECT * FROM testdata WHERE age > 18 ORDER BY age DESC
Example of DB
    |id|Name      |age|
    |9 |perso1    |66 |
    |10|rergfdgd  |55 |
    |11|gthfghfh  |44 |
    |9 |hghghgh   |33 |
    |1 |kgthht    |22 |
    |2 |ghjgj     |21 |
    |3 |fhgjg     |20 | 
    |4 |hjhjhjh   |19 |
    |12|ghgjgjg   |18 |
    |6 |tgjhgf    |17 |
    |7 |jhmgmhg   |16 |
    |8 |fghgjgjg  |15 |

마지막으로 찾은 행의 위치가 9인 경우,order그리고.limit올바른 데이터를 가져올 수 있습니다.

SELECT * 
    FROM testdata 
    WHERE age > 18 
    ORDER BY age DESC
    LIMIT 9,1

이는 사실상 처음 9개의 행을 무시하고 1개의 행만 가져옵니다.

상세한 것에 대하여는, https://mariadb.com/kb/en/the-mariadb-library/select/#limit 를 참조해 주세요.

쿼리를 순서대로 가져오려면 커서가 올바른 해결책입니다.https://dev.mysql.com/doc/refman/5.7/en/cursors.html

맞아요, 매번 완전한 결과 세트를 뽑아내서 반복하는 것도 괜찮겠지만, 이 문제를 해결할 수 있는 더 우아한 방법이 있어요.

여기 제가 추천하는 것이 있습니다.

옵션 1: 부울 필드를 사용하여 레코드가 이미 편집되었는지 여부를 플래그 지정합니다.이 예에서는 필드가edited기본값은 0(false)입니다.레코드가 편집되면,edited플래그를 1(true)로 설정합니다.

선택한 쿼리는 다음과 같습니다.

SELECT * FROM testdata WHERE age > 18 and edited = 0 ORDER BY age DESC limit 1

그러면 php 코드에서 첫 번째 레코드인 결과를 루프할 필요가 없습니다(그리고 당신이 다음을 포함하는 경우에만 해당됩니다).LIMIT 1( )는 아직 편집되지 않은 다음 레코드가 됩니다.

옵션 2: a 추가date_modified기본값이 NULL인 필드. 레코드를 편집할 때 저장now()에서date_modified필드. 그러면 다음과 같이 질문할 수 있습니다.

SELECT * FROM testdata WHERE age > 18 and date_modified IS NOT NULL ORDER BY age DESC limit 1

첫 번째 옵션과 마찬가지로 첫 번째 레코드인 결과를 루프할 필요가 없습니다(또한 첫 번째 레코드는LIMIT 1( )는 아직 편집되지 않은 다음 레코드가 됩니다.

언급URL : https://stackoverflow.com/questions/45905067/get-next-mysql-entry-with-stay-my-ordering

반응형