Je serais heureux si quelqu'un pouvait m'aider: j'ai cette table MYSQL:

    -- ----------------------------
    -- Table structure for `massimp`
    -- ----------------------------
    DROP TABLE IF EXISTS `massimp`;
    CREATE TABLE `massimp` (
      `recid` int(11) NOT NULL AUTO_INCREMENT,
      `Artikelnummer` varchar(100) DEFAULT NULL,
      `Lieferant` varchar(100) DEFAULT NULL,
      `SafetyFilename` varchar(2000) DEFAULT NULL,
      `SpecFilename` varchar(2000) DEFAULT NULL,
      PRIMARY KEY (`recid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of massimp
    -- ----------------------------
    INSERT INTO `massimp` VALUES ('1', 'T1503', 'SIGMA-ALDRICH', 'H:\\USERDATA\\MSDS-DEMO\\Sigma-Aldrich\\MSDS\\T1503_PrintMSDSAction.pdf', '');
    INSERT INTO `massimp` VALUES ('2', '101614', 'MERCK', '', 'H:\\USERDATA\\MSDS-DEMO\\Merck\\SPEC\\101614_494-Vitamin B12-111988.pdf');
    INSERT INTO `massimp` VALUES ('3', '101116', 'MERCK', '', 'H:\\USERDATA\\MSDS-DEMO\\Merck\\SPEC\\101116_AT_DE_0002_Food_and_Beverage_Campaign_Adulerants_Non-native_Amino_Acids_In_Milk_MM.pdf');
    INSERT INTO `massimp` VALUES ('4', '101614', 'MERCK', 'H:\\USERDATA\\MSDS-DEMO\\Merck\\MSDS\\101614_SDS_AT_DE.PDF', '');
    INSERT INTO `massimp` VALUES ('5', '101116', 'MERCK', 'H:\\USERDATA\\MSDS-DEMO\\Merck\\MSDS\\101116_SDS_AT_DE.PDF', '');
    

Quand je fais une requête comme celle-ci:

      SELECT a.safetyfilename, b.specfilename, a.Artikelnummer,a.Lieferant from massimp a 
         join massimp b on a.Artikelnummer=b.Artikelnummer and a.Lieferant= b.Lieferant;

J'obtiens cette sortie, qui n'est pas celle que je voulais:

wrong output

Je voudrais obtenir une TABLE où

  1. si safetyfilename et specfilename d'un Artikelnummer sont disponibles, sa ligne doit être imprimée - et seulement cette ligne pour la spécification Artikelnummer.
  2. si un seul nom de fichier est disponible, le nom de fichier disponible doit être imprimé.
  3. si aucun nom de fichier n'est disponible, aucune ligne ne doit être imprimée

Quelqu'un peut-il me dire comment rendre cela sophistiqué dans une requête MySQL?

Merci

0
Walter Schrabmair 27 févr. 2021 à 19:30

2 réponses

Meilleure réponse

Cela devrait faire ce que vous voulez.

SELECT 
    CASE 
        WHEN b.specfilename != '' THEN b.specfilename
        ELSE a.safetyfilename
    END AS filename,
    a.Artikelnummer,
    a.Lieferant 
FROM massimp a 
    JOIN massimp b ON
        a.Artikelnummer=b.Artikelnummer AND 
        b.Lieferant= b.Lieferant
WHERE (a.SafetyFilename != '' OR b.SpecFilename != '');
1
Mark B 27 févr. 2021 à 17:40

Merci Mark B, avec votre idée, je pourrais le faire:

    SELECT 
        a.SafetyFilename,
        b.SpecFilename,
        a.Artikelnummer,
        a.Lieferant 
    FROM massimp a 
        JOIN massimp b ON
            a.Artikelnummer=b.Artikelnummer AND 
            b.Lieferant= b.Lieferant
    WHERE (a.SafetyFilename != '' and b.SpecFilename != '')
    
    union 
    Select
        a.SafetyFilename,
        b.SpecFilename,
        a.Artikelnummer,
        a.Lieferant 
    FROM massimp a 
        JOIN massimp b ON
            a.Artikelnummer=b.Artikelnummer AND 
            b.Lieferant= b.Lieferant
    WHERE (a.SafetyFilename = '' and b.SpecFilename != '')
    union 
    Select
        a.SafetyFilename,
        b.SpecFilename,
        a.Artikelnummer,
        a.Lieferant 
    FROM massimp a 
        JOIN massimp b ON
            a.Artikelnummer=b.Artikelnummer AND 
            b.Lieferant= b.Lieferant
    WHERE (a.SafetyFilename != '' and b.SpecFilename = '')
    ;
    
0
Walter Schrabmair 27 févr. 2021 à 22:45