2
votes

Impossible d'obtenir les lignes filtrées par lignes de groupe dans SQL

J'ai une table où il y a une date de début et une date de fin, ces lignes sont regroupées par identifiant unique, par exemple, l'ID de ligne 4,5 a group_identify_id 5700045 et l'ID de ligne 1,2,3 a group_identify_id 5700044. ces groupes où toutes les lignes du groupe ont une colonne de début supérieure à la date actuelle. Pour par exemple. si la date actuelle est 15, alors 5700045 ne devrait pas être affiché dans le résultat.

$results =  $this->db->where('where('DATE(start) >=',$currentDate)->get('schedule_diary')->result();    

le résultat devrait être quelque chose comme ceci:

résultat:

1          2019-07-18 07:15:00  2019-07-18 08:15:00          5700044
2          2019-07-16 07:15:00  2019-07-16 08:15:00          5700044
3          2019-07-17 07:15:00  2019-07-17 08:15:00          5700044

J'essayais quelque chose comme ceci:

id                start                       end        group_identify_id

1          2019-07-18 07:15:00  2019-07-18 08:15:00          5700044
2          2019-07-16 07:15:00  2019-07-16 08:15:00          5700044
3          2019-07-17 07:15:00  2019-07-17 08:15:00          5700044
4          2019-07-15 07:15:00  2019-07-15 08:15:00          5700045
5          2019-07-14 07:15:00  2019-07-14 08:15:00          5700045

mais cela correspondait à toutes les lignes et non au groupe de lignes. p>


5 commentaires

Quelle est la valeur de $ currentDate ?


cette variable contient la date d'aujourd'hui


Je suis intéressé par, quel est le format de $ currentDate .. est-il comparable?


format de la date 2019-07-15 12:14:50


@ user3653474 Essayez de supprimer l'heure de $ date actuelle


6 Réponses :


1
votes

Voici la requête brute qui vous donnerait le résultat requis.

SELECT * FROM schedule_diary WHERE group_identify_id NON IN ( SELECT group_identify_id FROM schedule_diary WHERE start  <= $currentDate) );

Vous devez convertir cette requête en CodeIgniter Framework ou vous pouvez également utiliser la requête $ this-> db-> ( 'RawQueryHere')


1 commentaires

$ result = $ this-> db-> query ('SELECT * FROM nom_table WHERE DATE (START)> "$ currentDate" AND group_unique_key NOT IN (SELECT distinct group_unique_key FROM table_name WHERE DATE (START) <= "$ currentDate")' ) -> résultat ();



0
votes

Je ne suis pas sûr, mais je pense que ce est étrange ici:

$results =  $this->db->where('DATE(start) >=',$currentDate)->get('schedule_diary')->result();

Essayez de le supprimer dans votre requête:

XXX


0 commentaires

1
votes

MISE À JOUR Vous pouvez tester avec quelque chose comme ça si vous avez des valeurs nulles dans group_identify_id :

  /*Firstly, you should to select a set of rows whiches not in date*/
    $this->db->where('t1.group_identify_id = schedule_diary.group_identify_id');
    $this->db->where('DATE(t1.start) <= GETDATE()');
    $subquery = $this->db->get_compiled_select('schedule_diary as t1', TRUE);

  /*For last, you select all rows not exists in the subquery set.*/
    $this->db->where("not exists ($subquery)");
    $query = $this->db->get('schedule_diary');

    if($query){
      return $query->result_array();
    }

Je pense que c'est le bon code pour vous!


5 commentaires

Merci écrou, il ne renvoie aucune ligne, certaines valeurs sont nulles dans group_identify_id dans ma base de données.


D'accord. Testez maintenant avec NOT EXISTS.


J'ai essayé cette requête mais elle ne renvoie aucun résultat si je supprime la condition où puis il imprime le résultat


Modifiez CAST (t1.start comme DATE) au lieu de DATE (t1.start). Notez que la fonction GETDATE est aujourd'hui. Avez-vous des lignes pour aujourd'hui? Je teste sur mon ordinateur et cela fonctionne sur un serveur SQL.


Ou testez directement avec cette requête: `` SELECT * FROM schedule_diary WHERE n'existe pas (SELECT * FROM schedule_diary as t1 WHERE t1.group_identify_id = Test.group_identify_id and CAST (t1.start as DATE) <= '2019-07-15' ) ´´´



0
votes

Utilisez cette requête brute ou convertissez-la au format codeignieter

SELECT * FROM schedule_diary WHERE DATE(START) > date("2019-07-14") AND group_identify_id NOT IN (SELECT distinct group_identify_id FROM schedule_diary WHERE DATE(START) <= date("2019-07-14"))

Cela fonctionnera parfaitement.

Capture d'écran fonctionnelle ..

SELECT * FROM schedule_diary WHERE DATE(START) > "$currentDate" AND group_identify_id NOT IN (SELECT distinct group_identify_id FROM test_1 WHERE DATE(START) <= "$currentDate")


7 commentaires

@merci j'ai essayé cette requête mais elle ne renvoie aucun résultat: $ result = $ this-> db-> query ('SELECT * FROM nom_table WHERE DATE (START)> "$ currentDate" AND group_unique_key NOT IN (SELECT distinct group_unique_key FROM nom_table WHERE DATE (START) <= "$ currentDate") ') -> result ();


@ user3653474 dans quel format vous transmettez la date .. utilisez le format Ymd ou essayez cette requête .. SELECT * FROM schedule_diary WHERE DATE (START)> date ("$ currentDate") AND group_identify_id NOT IN (SELECT distinct group_identify_id FROM test_1 WHERE DATE (START) <= date ("$ currentDate"))


@ user3653474 J'ai modifié ma question, essayez d'exécuter cette requête .. ne transmettez pas le paramètre de date pour le test.


Merci, cela fonctionne encore une chose que je veux effacer si je dois utiliser une autre condition telle que l'heure de début et l'heure de fin. Chaque fois que je dois utiliser la condition opposée de la requête principale dans la sous-requête. Pour par exemple. AND (TIME (start) BETWEEN time ("'. $ Start_time.'") AND time ("'. $ End_time.'") Donc à l'intérieur de la sous-requête, nous devrons utiliser NOT BETWEEN.


Entre est un raccourci pour> = et <=. Ainsi, vous pouvez utiliser ces opérateurs selon vos besoins.


Comme vous avez utilisé DATE (START)> date ("2019-07-14") dans la requête externe et dans la sous-requête, il s'agit de la condition opposée DATE (START) <= date ("2019-07-14") donc pour l'heure Je dois utiliser le même concept que la sous-requête contiendra la condition opposée à la condition de requête externe.


vous pouvez vérifier la date et l'heure ensemble. 2019-07-14. Si vous voulez faire comme ça, alors ... utilisez cette requête. SELECT * FROM agenda_diary WHERE DATE (START)> date ("2019-07-14") ET HEURE (début) ENTRE l'heure ("00:00") AND time ("12:00") AND group_identify_id NOT IN (SELECT distinct group_identify_id FROM schedule_diary WHERE DATE (START) <= date ("2019-07-14") AND TIME (start) <= time ("00:00" ) et HEURE (début)> = heure ("12:00"))



0
votes

essayez cette requête:

$this->db->where('start >', $currentDate)->get('schedule_diary')->result(); 


0 commentaires

0
votes

Vous pouvez essayer ceci, requête brute

$this->db->table('schedule_diary')->group_by('group_identify_id')->having('start', $currentDate);

pour codeigniter que vous pouvez utiliser

select * from schedule_diary group by group_identify_id having start > CURDATE()


0 commentaires