9
votes

Mysql: comment utiliser regroupement

Dis que j'ai le tableau suivant: xxx

Comment puis-je interroger cela tel qu'il tente de me donner le nom et et > où language_id = 2, mais retombez sur Language_ID = 1 Si la colonne contient une nulle?

dans l'exemple ci-dessus, je devrais obtenir < Code> lorem 1 pour nom et vraiment sympa widget. Achetez-le maintenant! pour description .


0 commentaires

5 Réponses :


1
votes
select name, description from product
where product_id = @pid
  and name is not null
  and description is not null
  and (language_id = @lang or language_id = 1)
order by language_id desc
where @pid is the current product id and @lang is the current language id.The first row returned will contain the current name and description.This assumes that the row language_id = 1 will NOT contain NULL in name or description.

4 commentaires

et comment cela gère-t-il des colonnes nulles? Cela va-t-il tomber à la valeur de langage_id = 1?


Désolé, n'a pas vu l'exigence nulle. Je modifierai la STEMT STMT.


Les nulls sont attendus des valeurs des colonnes.


Je reçois toutes les langues



0
votes
select p2.product_id
      ,coalesce(p2.name, p1.name, 'No name') as name
      ,coalesce(p2.description, p1.description, 'No description') as description
  from product p2
  left join product p1 on(
       p1.product_id = p2.product_id
   and p1.language_id = 1
  )
 where p2.product_id  = 1
   and p2.language_id = 2;
Edit1:
The above query assumes that the language=2 row exist but that the name/descr may be null.Edit 2.
I just remembered someone asked a similar question recently. And then I discovered it was you. You need to separate the products from the translations. That is what is making this query hard to write. Thomas answer makes it easy to do what you want.

3 commentaires

Mec c'est vraiment une pensée de merde. Aller au sommeil Ronnis!


Et si la langue = 2 n'existe pas? Aucune garantie qu'il existera, en fait.


Les questions étaient différentes. La question précédente traitait de la modélisation. Thomas a fourni une suggestion sur la manière de modéliser et d'interroger les données. J'ai décidé d'utiliser une approche de modélisation qui diffère de la suggestion de Thomas. Maintenant, j'ai besoin de pouvoir interroger cela de la même manière que la suggestion de Thomas.



8
votes

Que diriez-vous de cela? XXX

Où:

  • @pid : ID de produit actuel
  • @LID : ID de langue actuelle
  • valeurs pour nom et / ou Description pourrait être null
  • langue_id = 2 élément n'a pas pu exister

0 commentaires

0
votes

Assomption: il y a une entrée pour chaque produit avec langue = 1 code> Le code ci-dessous est juste simple SQL pour récupérer ce que vous voulez.

Un autre sujet est si vous souhaitez que le comportement que vous avez demandé .. Parce que vous pouvez avoir des langages mixtes entre nom code> et description code>. Je le concevrais différemment, si l'un des deux champs est vide, je retournerais par défaut dans la langue principale (1). P>

select p.product_id,
  coalesce(pl.name, p.name, 'No name') as name,
  coalesce(pl.description, p.description, 'No description') as description
from product p
  left join product pl on (pl.product_id = p.product_id and pl.language_id = :language_id)
where p.product_id = :product_id and p.language_id = 1


0 commentaires

0
votes

Voici un exemple d'utilisation avec SQL Update:

C'est comme équivalent à la NVL d'Oracle. Vous pouvez l'utiliser comme ci-dessous dans une instruction préparée à l'aide de paramètres xxx


0 commentaires